207 SUBROUTINE sgesvd( JOBU, JOBVT, M, N, A, LDA, S, U, LDU, VT,
209 $ WORK, LWORK, INFO )
216 CHARACTER JOBU, JOBVT
217 INTEGER INFO, LDA, LDU, LDVT, LWORK, M, N
220 REAL A( LDA, * ), S( * ), U( LDU, * ),
221 $ VT( LDVT, * ), WORK( * )
228 PARAMETER ( ZERO = 0.0e0, one = 1.0e0 )
231 LOGICAL LQUERY, WNTUA, WNTUAS, WNTUN, WNTUO, WNTUS,
232 $ WNTVA, WNTVAS, WNTVN, WNTVO, WNTVS
233 INTEGER BDSPAC, BLK, CHUNK, I, IE, IERR, IR, ISCL,
234 $ ITAU, ITAUP, ITAUQ, IU, IWORK, LDWRKR, LDWRKU,
235 $ maxwrk, minmn, minwrk, mnthr, ncu, ncvt, nru,
237 INTEGER LWORK_SGEQRF, LWORK_SORGQR_N, LWORK_SORGQR_M,
238 $ LWORK_SGEBRD, LWORK_SORGBR_P, LWORK_SORGBR_Q,
239 $ lwork_sgelqf, lwork_sorglq_n, lwork_sorglq_m
240 REAL ANRM, BIGNUM, EPS, SMLNUM
254 REAL SLAMCH, SLANGE, SROUNDUP_LWORK
255 EXTERNAL lsame, ilaenv, slamch, slange,
259 INTRINSIC max, min, sqrt
267 wntua = lsame( jobu,
'A' )
268 wntus = lsame( jobu,
'S' )
269 wntuas = wntua .OR. wntus
270 wntuo = lsame( jobu,
'O' )
271 wntun = lsame( jobu,
'N' )
272 wntva = lsame( jobvt,
'A' )
273 wntvs = lsame( jobvt,
'S' )
274 wntvas = wntva .OR. wntvs
275 wntvo = lsame( jobvt,
'O' )
276 wntvn = lsame( jobvt,
'N' )
277 lquery = ( lwork.EQ.-1 )
279 IF( .NOT.( wntua .OR. wntus .OR. wntuo .OR. wntun ) )
THEN
281 ELSE IF( .NOT.( wntva .OR. wntvs .OR. wntvo .OR. wntvn ) .OR.
282 $ ( wntvo .AND. wntuo ) )
THEN
284 ELSE IF( m.LT.0 )
THEN
286 ELSE IF( n.LT.0 )
THEN
288 ELSE IF( lda.LT.max( 1, m ) )
THEN
290 ELSE IF( ldu.LT.1 .OR. ( wntuas .AND. ldu.LT.m ) )
THEN
292 ELSE IF( ldvt.LT.1 .OR. ( wntva .AND. ldvt.LT.n ) .OR.
293 $ ( wntvs .AND. ldvt.LT.minmn ) )
THEN
307 IF( m.GE.n .AND. minmn.GT.0 )
THEN
311 mnthr = ilaenv( 6,
'SGESVD', jobu // jobvt, m, n, 0, 0 )
314 CALL sgeqrf( m, n, a, lda, dum(1), dum(1), -1, ierr )
315 lwork_sgeqrf = int( dum(1) )
317 CALL sorgqr( m, n, n, a, lda, dum(1), dum(1), -1, ierr )
318 lwork_sorgqr_n = int( dum(1) )
319 CALL sorgqr( m, m, n, a, lda, dum(1), dum(1), -1, ierr )
320 lwork_sorgqr_m = int( dum(1) )
322 CALL sgebrd( n, n, a, lda, s, dum(1), dum(1),
323 $ dum(1), dum(1), -1, ierr )
324 lwork_sgebrd = int( dum(1) )
326 CALL sorgbr(
'P', n, n, n, a, lda, dum(1),
328 lwork_sorgbr_p = int( dum(1) )
330 CALL sorgbr(
'Q', n, n, n, a, lda, dum(1),
332 lwork_sorgbr_q = int( dum(1) )
334 IF( m.GE.mnthr )
THEN
339 maxwrk = n + lwork_sgeqrf
340 maxwrk = max( maxwrk, 3*n+lwork_sgebrd )
341 IF( wntvo .OR. wntvas )
342 $ maxwrk = max( maxwrk, 3*n+lwork_sorgbr_p )
343 maxwrk = max( maxwrk, bdspac )
344 minwrk = max( 4*n, bdspac )
345 ELSE IF( wntuo .AND. wntvn )
THEN
349 wrkbl = n + lwork_sgeqrf
350 wrkbl = max( wrkbl, n+lwork_sorgqr_n )
351 wrkbl = max( wrkbl, 3*n+lwork_sgebrd )
352 wrkbl = max( wrkbl, 3*n+lwork_sorgbr_q )
353 wrkbl = max( wrkbl, bdspac )
354 maxwrk = max( n*n+wrkbl, n*n+m*n+n )
355 minwrk = max( 3*n+m, bdspac )
356 ELSE IF( wntuo .AND. wntvas )
THEN
361 wrkbl = n + lwork_sgeqrf
362 wrkbl = max( wrkbl, n+lwork_sorgqr_n )
363 wrkbl = max( wrkbl, 3*n+lwork_sgebrd )
364 wrkbl = max( wrkbl, 3*n+lwork_sorgbr_q )
365 wrkbl = max( wrkbl, 3*n+lwork_sorgbr_p )
366 wrkbl = max( wrkbl, bdspac )
367 maxwrk = max( n*n+wrkbl, n*n+m*n+n )
368 minwrk = max( 3*n+m, bdspac )
369 ELSE IF( wntus .AND. wntvn )
THEN
373 wrkbl = n + lwork_sgeqrf
374 wrkbl = max( wrkbl, n+lwork_sorgqr_n )
375 wrkbl = max( wrkbl, 3*n+lwork_sgebrd )
376 wrkbl = max( wrkbl, 3*n+lwork_sorgbr_q )
377 wrkbl = max( wrkbl, bdspac )
379 minwrk = max( 3*n+m, bdspac )
380 ELSE IF( wntus .AND. wntvo )
THEN
384 wrkbl = n + lwork_sgeqrf
385 wrkbl = max( wrkbl, n+lwork_sorgqr_n )
386 wrkbl = max( wrkbl, 3*n+lwork_sgebrd )
387 wrkbl = max( wrkbl, 3*n+lwork_sorgbr_q )
388 wrkbl = max( wrkbl, 3*n+lwork_sorgbr_p )
389 wrkbl = max( wrkbl, bdspac )
390 maxwrk = 2*n*n + wrkbl
391 minwrk = max( 3*n+m, bdspac )
392 ELSE IF( wntus .AND. wntvas )
THEN
397 wrkbl = n + lwork_sgeqrf
398 wrkbl = max( wrkbl, n+lwork_sorgqr_n )
399 wrkbl = max( wrkbl, 3*n+lwork_sgebrd )
400 wrkbl = max( wrkbl, 3*n+lwork_sorgbr_q )
401 wrkbl = max( wrkbl, 3*n+lwork_sorgbr_p )
402 wrkbl = max( wrkbl, bdspac )
404 minwrk = max( 3*n+m, bdspac )
405 ELSE IF( wntua .AND. wntvn )
THEN
409 wrkbl = n + lwork_sgeqrf
410 wrkbl = max( wrkbl, n+lwork_sorgqr_m )
411 wrkbl = max( wrkbl, 3*n+lwork_sgebrd )
412 wrkbl = max( wrkbl, 3*n+lwork_sorgbr_q )
413 wrkbl = max( wrkbl, bdspac )
415 minwrk = max( 3*n+m, bdspac )
416 ELSE IF( wntua .AND. wntvo )
THEN
420 wrkbl = n + lwork_sgeqrf
421 wrkbl = max( wrkbl, n+lwork_sorgqr_m )
422 wrkbl = max( wrkbl, 3*n+lwork_sgebrd )
423 wrkbl = max( wrkbl, 3*n+lwork_sorgbr_q )
424 wrkbl = max( wrkbl, 3*n+lwork_sorgbr_p )
425 wrkbl = max( wrkbl, bdspac )
426 maxwrk = 2*n*n + wrkbl
427 minwrk = max( 3*n+m, bdspac )
428 ELSE IF( wntua .AND. wntvas )
THEN
433 wrkbl = n + lwork_sgeqrf
434 wrkbl = max( wrkbl, n+lwork_sorgqr_m )
435 wrkbl = max( wrkbl, 3*n+lwork_sgebrd )
436 wrkbl = max( wrkbl, 3*n+lwork_sorgbr_q )
437 wrkbl = max( wrkbl, 3*n+lwork_sorgbr_p )
438 wrkbl = max( wrkbl, bdspac )
440 minwrk = max( 3*n+m, bdspac )
446 CALL sgebrd( m, n, a, lda, s, dum(1), dum(1),
447 $ dum(1), dum(1), -1, ierr )
448 lwork_sgebrd = int( dum(1) )
449 maxwrk = 3*n + lwork_sgebrd
450 IF( wntus .OR. wntuo )
THEN
451 CALL sorgbr(
'Q', m, n, n, a, lda, dum(1),
453 lwork_sorgbr_q = int( dum(1) )
454 maxwrk = max( maxwrk, 3*n+lwork_sorgbr_q )
457 CALL sorgbr(
'Q', m, m, n, a, lda, dum(1),
459 lwork_sorgbr_q = int( dum(1) )
460 maxwrk = max( maxwrk, 3*n+lwork_sorgbr_q )
462 IF( .NOT.wntvn )
THEN
463 maxwrk = max( maxwrk, 3*n+lwork_sorgbr_p )
465 maxwrk = max( maxwrk, bdspac )
466 minwrk = max( 3*n+m, bdspac )
468 ELSE IF( minmn.GT.0 )
THEN
472 mnthr = ilaenv( 6,
'SGESVD', jobu // jobvt, m, n, 0, 0 )
475 CALL sgelqf( m, n, a, lda, dum(1), dum(1), -1, ierr )
476 lwork_sgelqf = int( dum(1) )
478 CALL sorglq( n, n, m, dum(1), n, dum(1), dum(1), -1,
480 lwork_sorglq_n = int( dum(1) )
481 CALL sorglq( m, n, m, a, lda, dum(1), dum(1), -1, ierr )
482 lwork_sorglq_m = int( dum(1) )
484 CALL sgebrd( m, m, a, lda, s, dum(1), dum(1),
485 $ dum(1), dum(1), -1, ierr )
486 lwork_sgebrd = int( dum(1) )
488 CALL sorgbr(
'P', m, m, m, a, n, dum(1),
490 lwork_sorgbr_p = int( dum(1) )
492 CALL sorgbr(
'Q', m, m, m, a, n, dum(1),
494 lwork_sorgbr_q = int( dum(1) )
495 IF( n.GE.mnthr )
THEN
500 maxwrk = m + lwork_sgelqf
501 maxwrk = max( maxwrk, 3*m+lwork_sgebrd )
502 IF( wntuo .OR. wntuas )
503 $ maxwrk = max( maxwrk, 3*m+lwork_sorgbr_q )
504 maxwrk = max( maxwrk, bdspac )
505 minwrk = max( 4*m, bdspac )
506 ELSE IF( wntvo .AND. wntun )
THEN
510 wrkbl = m + lwork_sgelqf
511 wrkbl = max( wrkbl, m+lwork_sorglq_m )
512 wrkbl = max( wrkbl, 3*m+lwork_sgebrd )
513 wrkbl = max( wrkbl, 3*m+lwork_sorgbr_p )
514 wrkbl = max( wrkbl, bdspac )
515 maxwrk = max( m*m+wrkbl, m*m+m*n+m )
516 minwrk = max( 3*m+n, bdspac )
517 ELSE IF( wntvo .AND. wntuas )
THEN
522 wrkbl = m + lwork_sgelqf
523 wrkbl = max( wrkbl, m+lwork_sorglq_m )
524 wrkbl = max( wrkbl, 3*m+lwork_sgebrd )
525 wrkbl = max( wrkbl, 3*m+lwork_sorgbr_p )
526 wrkbl = max( wrkbl, 3*m+lwork_sorgbr_q )
527 wrkbl = max( wrkbl, bdspac )
528 maxwrk = max( m*m+wrkbl, m*m+m*n+m )
529 minwrk = max( 3*m+n, bdspac )
530 ELSE IF( wntvs .AND. wntun )
THEN
534 wrkbl = m + lwork_sgelqf
535 wrkbl = max( wrkbl, m+lwork_sorglq_m )
536 wrkbl = max( wrkbl, 3*m+lwork_sgebrd )
537 wrkbl = max( wrkbl, 3*m+lwork_sorgbr_p )
538 wrkbl = max( wrkbl, bdspac )
540 minwrk = max( 3*m+n, bdspac )
541 ELSE IF( wntvs .AND. wntuo )
THEN
545 wrkbl = m + lwork_sgelqf
546 wrkbl = max( wrkbl, m+lwork_sorglq_m )
547 wrkbl = max( wrkbl, 3*m+lwork_sgebrd )
548 wrkbl = max( wrkbl, 3*m+lwork_sorgbr_p )
549 wrkbl = max( wrkbl, 3*m+lwork_sorgbr_q )
550 wrkbl = max( wrkbl, bdspac )
551 maxwrk = 2*m*m + wrkbl
552 minwrk = max( 3*m+n, bdspac )
553 maxwrk = max( maxwrk, minwrk )
554 ELSE IF( wntvs .AND. wntuas )
THEN
559 wrkbl = m + lwork_sgelqf
560 wrkbl = max( wrkbl, m+lwork_sorglq_m )
561 wrkbl = max( wrkbl, 3*m+lwork_sgebrd )
562 wrkbl = max( wrkbl, 3*m+lwork_sorgbr_p )
563 wrkbl = max( wrkbl, 3*m+lwork_sorgbr_q )
564 wrkbl = max( wrkbl, bdspac )
566 minwrk = max( 3*m+n, bdspac )
567 ELSE IF( wntva .AND. wntun )
THEN
571 wrkbl = m + lwork_sgelqf
572 wrkbl = max( wrkbl, m+lwork_sorglq_n )
573 wrkbl = max( wrkbl, 3*m+lwork_sgebrd )
574 wrkbl = max( wrkbl, 3*m+lwork_sorgbr_p )
575 wrkbl = max( wrkbl, bdspac )
577 minwrk = max( 3*m+n, bdspac )
578 ELSE IF( wntva .AND. wntuo )
THEN
582 wrkbl = m + lwork_sgelqf
583 wrkbl = max( wrkbl, m+lwork_sorglq_n )
584 wrkbl = max( wrkbl, 3*m+lwork_sgebrd )
585 wrkbl = max( wrkbl, 3*m+lwork_sorgbr_p )
586 wrkbl = max( wrkbl, 3*m+lwork_sorgbr_q )
587 wrkbl = max( wrkbl, bdspac )
588 maxwrk = 2*m*m + wrkbl
589 minwrk = max( 3*m+n, bdspac )
590 ELSE IF( wntva .AND. wntuas )
THEN
595 wrkbl = m + lwork_sgelqf
596 wrkbl = max( wrkbl, m+lwork_sorglq_n )
597 wrkbl = max( wrkbl, 3*m+lwork_sgebrd )
598 wrkbl = max( wrkbl, 3*m+lwork_sorgbr_p )
599 wrkbl = max( wrkbl, 3*m+lwork_sorgbr_q )
600 wrkbl = max( wrkbl, bdspac )
602 minwrk = max( 3*m+n, bdspac )
608 CALL sgebrd( m, n, a, lda, s, dum(1), dum(1),
609 $ dum(1), dum(1), -1, ierr )
610 lwork_sgebrd = int( dum(1) )
611 maxwrk = 3*m + lwork_sgebrd
612 IF( wntvs .OR. wntvo )
THEN
614 CALL sorgbr(
'P', m, n, m, a, n, dum(1),
616 lwork_sorgbr_p = int( dum(1) )
617 maxwrk = max( maxwrk, 3*m+lwork_sorgbr_p )
620 CALL sorgbr(
'P', n, n, m, a, n, dum(1),
622 lwork_sorgbr_p = int( dum(1) )
623 maxwrk = max( maxwrk, 3*m+lwork_sorgbr_p )
625 IF( .NOT.wntun )
THEN
626 maxwrk = max( maxwrk, 3*m+lwork_sorgbr_q )
628 maxwrk = max( maxwrk, bdspac )
629 minwrk = max( 3*m+n, bdspac )
632 maxwrk = max( maxwrk, minwrk )
633 work( 1 ) = sroundup_lwork(maxwrk)
635 IF( lwork.LT.minwrk .AND. .NOT.lquery )
THEN
641 CALL xerbla(
'SGESVD', -info )
643 ELSE IF( lquery )
THEN
649 IF( m.EQ.0 .OR. n.EQ.0 )
THEN
656 smlnum = sqrt( slamch(
'S' ) ) / eps
657 bignum = one / smlnum
661 anrm = slange(
'M', m, n, a, lda, dum )
663 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN
665 CALL slascl(
'G', 0, 0, anrm, smlnum, m, n, a, lda, ierr )
666 ELSE IF( anrm.GT.bignum )
THEN
668 CALL slascl(
'G', 0, 0, anrm, bignum, m, n, a, lda, ierr )
677 IF( m.GE.mnthr )
THEN
690 CALL sgeqrf( m, n, a, lda, work( itau ),
692 $ lwork-iwork+1, ierr )
697 CALL slaset(
'L', n-1, n-1, zero, zero, a( 2, 1 ),
708 CALL sgebrd( n, n, a, lda, s, work( ie ),
710 $ work( itaup ), work( iwork ), lwork-iwork+1,
713 IF( wntvo .OR. wntvas )
THEN
718 CALL sorgbr(
'P', n, n, n, a, lda, work( itaup ),
719 $ work( iwork ), lwork-iwork+1, ierr )
728 CALL sbdsqr(
'U', n, ncvt, 0, 0, s, work( ie ), a,
730 $ dum, 1, dum, 1, work( iwork ), info )
735 $
CALL slacpy(
'F', n, n, a, lda, vt, ldvt )
737 ELSE IF( wntuo .AND. wntvn )
THEN
743 IF( lwork.GE.n*n+max( 4*n, bdspac ) )
THEN
748 IF( lwork.GE.max( wrkbl, lda*n+n )+lda*n )
THEN
754 ELSE IF( lwork.GE.max( wrkbl, lda*n+n )+n*n )
THEN
764 ldwrku = ( lwork-n*n-n ) / n
773 CALL sgeqrf( m, n, a, lda, work( itau ),
774 $ work( iwork ), lwork-iwork+1, ierr )
778 CALL slacpy(
'U', n, n, a, lda, work( ir ),
780 CALL slaset(
'L', n-1, n-1, zero, zero,
787 CALL sorgqr( m, n, n, a, lda, work( itau ),
788 $ work( iwork ), lwork-iwork+1, ierr )
797 CALL sgebrd( n, n, work( ir ), ldwrkr, s,
799 $ work( itauq ), work( itaup ),
800 $ work( iwork ), lwork-iwork+1, ierr )
805 CALL sorgbr(
'Q', n, n, n, work( ir ), ldwrkr,
806 $ work( itauq ), work( iwork ),
807 $ lwork-iwork+1, ierr )
814 CALL sbdsqr(
'U', n, 0, n, 0, s, work( ie ), dum,
816 $ work( ir ), ldwrkr, dum, 1,
817 $ work( iwork ), info )
824 DO 10 i = 1, m, ldwrku
825 chunk = min( m-i+1, ldwrku )
826 CALL sgemm(
'N',
'N', chunk, n, n, one, a( i,
828 $ lda, work( ir ), ldwrkr, zero,
829 $ work( iu ), ldwrku )
830 CALL slacpy(
'F', chunk, n, work( iu ), ldwrku,
846 CALL sgebrd( m, n, a, lda, s, work( ie ),
847 $ work( itauq ), work( itaup ),
848 $ work( iwork ), lwork-iwork+1, ierr )
853 CALL sorgbr(
'Q', m, n, n, a, lda, work( itauq ),
854 $ work( iwork ), lwork-iwork+1, ierr )
861 CALL sbdsqr(
'U', n, 0, m, 0, s, work( ie ), dum,
863 $ a, lda, dum, 1, work( iwork ), info )
867 ELSE IF( wntuo .AND. wntvas )
THEN
873 IF( lwork.GE.n*n+max( 4*n, bdspac ) )
THEN
878 IF( lwork.GE.max( wrkbl, lda*n+n )+lda*n )
THEN
884 ELSE IF( lwork.GE.max( wrkbl, lda*n+n )+n*n )
THEN
894 ldwrku = ( lwork-n*n-n ) / n
903 CALL sgeqrf( m, n, a, lda, work( itau ),
904 $ work( iwork ), lwork-iwork+1, ierr )
908 CALL slacpy(
'U', n, n, a, lda, vt, ldvt )
910 $
CALL slaset(
'L', n-1, n-1, zero, zero,
916 CALL sorgqr( m, n, n, a, lda, work( itau ),
917 $ work( iwork ), lwork-iwork+1, ierr )
926 CALL sgebrd( n, n, vt, ldvt, s, work( ie ),
927 $ work( itauq ), work( itaup ),
928 $ work( iwork ), lwork-iwork+1, ierr )
929 CALL slacpy(
'L', n, n, vt, ldvt, work( ir ),
935 CALL sorgbr(
'Q', n, n, n, work( ir ), ldwrkr,
936 $ work( itauq ), work( iwork ),
937 $ lwork-iwork+1, ierr )
942 CALL sorgbr(
'P', n, n, n, vt, ldvt, work( itaup ),
943 $ work( iwork ), lwork-iwork+1, ierr )
951 CALL sbdsqr(
'U', n, n, n, 0, s, work( ie ), vt,
953 $ work( ir ), ldwrkr, dum, 1,
954 $ work( iwork ), info )
961 DO 20 i = 1, m, ldwrku
962 chunk = min( m-i+1, ldwrku )
963 CALL sgemm(
'N',
'N', chunk, n, n, one, a( i,
965 $ lda, work( ir ), ldwrkr, zero,
966 $ work( iu ), ldwrku )
967 CALL slacpy(
'F', chunk, n, work( iu ), ldwrku,
981 CALL sgeqrf( m, n, a, lda, work( itau ),
982 $ work( iwork ), lwork-iwork+1, ierr )
986 CALL slacpy(
'U', n, n, a, lda, vt, ldvt )
988 $
CALL slaset(
'L', n-1, n-1, zero, zero,
994 CALL sorgqr( m, n, n, a, lda, work( itau ),
995 $ work( iwork ), lwork-iwork+1, ierr )
1004 CALL sgebrd( n, n, vt, ldvt, s, work( ie ),
1005 $ work( itauq ), work( itaup ),
1006 $ work( iwork ), lwork-iwork+1, ierr )
1011 CALL sormbr(
'Q',
'R',
'N', m, n, n, vt, ldvt,
1012 $ work( itauq ), a, lda, work( iwork ),
1013 $ lwork-iwork+1, ierr )
1018 CALL sorgbr(
'P', n, n, n, vt, ldvt, work( itaup ),
1019 $ work( iwork ), lwork-iwork+1, ierr )
1027 CALL sbdsqr(
'U', n, n, m, 0, s, work( ie ), vt,
1029 $ a, lda, dum, 1, work( iwork ), info )
1033 ELSE IF( wntus )
THEN
1041 IF( lwork.GE.n*n+max( 4*n, bdspac ) )
THEN
1046 IF( lwork.GE.wrkbl+lda*n )
THEN
1057 itau = ir + ldwrkr*n
1063 CALL sgeqrf( m, n, a, lda, work( itau ),
1064 $ work( iwork ), lwork-iwork+1, ierr )
1068 CALL slacpy(
'U', n, n, a, lda, work( ir ),
1070 CALL slaset(
'L', n-1, n-1, zero, zero,
1071 $ work( ir+1 ), ldwrkr )
1076 CALL sorgqr( m, n, n, a, lda, work( itau ),
1077 $ work( iwork ), lwork-iwork+1, ierr )
1086 CALL sgebrd( n, n, work( ir ), ldwrkr, s,
1087 $ work( ie ), work( itauq ),
1088 $ work( itaup ), work( iwork ),
1089 $ lwork-iwork+1, ierr )
1094 CALL sorgbr(
'Q', n, n, n, work( ir ), ldwrkr,
1095 $ work( itauq ), work( iwork ),
1096 $ lwork-iwork+1, ierr )
1103 CALL sbdsqr(
'U', n, 0, n, 0, s, work( ie ),
1105 $ 1, work( ir ), ldwrkr, dum, 1,
1106 $ work( iwork ), info )
1112 CALL sgemm(
'N',
'N', m, n, n, one, a, lda,
1113 $ work( ir ), ldwrkr, zero, u, ldu )
1125 CALL sgeqrf( m, n, a, lda, work( itau ),
1126 $ work( iwork ), lwork-iwork+1, ierr )
1127 CALL slacpy(
'L', m, n, a, lda, u, ldu )
1132 CALL sorgqr( m, n, n, u, ldu, work( itau ),
1133 $ work( iwork ), lwork-iwork+1, ierr )
1142 CALL slaset(
'L', n-1, n-1, zero, zero,
1149 CALL sgebrd( n, n, a, lda, s, work( ie ),
1150 $ work( itauq ), work( itaup ),
1151 $ work( iwork ), lwork-iwork+1, ierr )
1156 CALL sormbr(
'Q',
'R',
'N', m, n, n, a, lda,
1157 $ work( itauq ), u, ldu, work( iwork ),
1158 $ lwork-iwork+1, ierr )
1165 CALL sbdsqr(
'U', n, 0, m, 0, s, work( ie ),
1167 $ 1, u, ldu, dum, 1, work( iwork ),
1172 ELSE IF( wntvo )
THEN
1178 IF( lwork.GE.2*n*n+max( 4*n, bdspac ) )
THEN
1183 IF( lwork.GE.wrkbl+2*lda*n )
THEN
1190 ELSE IF( lwork.GE.wrkbl+( lda+n )*n )
THEN
1205 itau = ir + ldwrkr*n
1211 CALL sgeqrf( m, n, a, lda, work( itau ),
1212 $ work( iwork ), lwork-iwork+1, ierr )
1216 CALL slacpy(
'U', n, n, a, lda, work( iu ),
1218 CALL slaset(
'L', n-1, n-1, zero, zero,
1219 $ work( iu+1 ), ldwrku )
1224 CALL sorgqr( m, n, n, a, lda, work( itau ),
1225 $ work( iwork ), lwork-iwork+1, ierr )
1236 CALL sgebrd( n, n, work( iu ), ldwrku, s,
1237 $ work( ie ), work( itauq ),
1238 $ work( itaup ), work( iwork ),
1239 $ lwork-iwork+1, ierr )
1240 CALL slacpy(
'U', n, n, work( iu ), ldwrku,
1241 $ work( ir ), ldwrkr )
1246 CALL sorgbr(
'Q', n, n, n, work( iu ), ldwrku,
1247 $ work( itauq ), work( iwork ),
1248 $ lwork-iwork+1, ierr )
1254 CALL sorgbr(
'P', n, n, n, work( ir ), ldwrkr,
1255 $ work( itaup ), work( iwork ),
1256 $ lwork-iwork+1, ierr )
1264 CALL sbdsqr(
'U', n, n, n, 0, s, work( ie ),
1265 $ work( ir ), ldwrkr, work( iu ),
1266 $ ldwrku, dum, 1, work( iwork ), info )
1272 CALL sgemm(
'N',
'N', m, n, n, one, a, lda,
1273 $ work( iu ), ldwrku, zero, u, ldu )
1278 CALL slacpy(
'F', n, n, work( ir ), ldwrkr, a,
1291 CALL sgeqrf( m, n, a, lda, work( itau ),
1292 $ work( iwork ), lwork-iwork+1, ierr )
1293 CALL slacpy(
'L', m, n, a, lda, u, ldu )
1298 CALL sorgqr( m, n, n, u, ldu, work( itau ),
1299 $ work( iwork ), lwork-iwork+1, ierr )
1308 CALL slaset(
'L', n-1, n-1, zero, zero,
1315 CALL sgebrd( n, n, a, lda, s, work( ie ),
1316 $ work( itauq ), work( itaup ),
1317 $ work( iwork ), lwork-iwork+1, ierr )
1322 CALL sormbr(
'Q',
'R',
'N', m, n, n, a, lda,
1323 $ work( itauq ), u, ldu, work( iwork ),
1324 $ lwork-iwork+1, ierr )
1329 CALL sorgbr(
'P', n, n, n, a, lda,
1331 $ work( iwork ), lwork-iwork+1, ierr )
1339 CALL sbdsqr(
'U', n, n, m, 0, s, work( ie ), a,
1340 $ lda, u, ldu, dum, 1, work( iwork ),
1345 ELSE IF( wntvas )
THEN
1352 IF( lwork.GE.n*n+max( 4*n, bdspac ) )
THEN
1357 IF( lwork.GE.wrkbl+lda*n )
THEN
1368 itau = iu + ldwrku*n
1374 CALL sgeqrf( m, n, a, lda, work( itau ),
1375 $ work( iwork ), lwork-iwork+1, ierr )
1379 CALL slacpy(
'U', n, n, a, lda, work( iu ),
1381 CALL slaset(
'L', n-1, n-1, zero, zero,
1382 $ work( iu+1 ), ldwrku )
1387 CALL sorgqr( m, n, n, a, lda, work( itau ),
1388 $ work( iwork ), lwork-iwork+1, ierr )
1397 CALL sgebrd( n, n, work( iu ), ldwrku, s,
1398 $ work( ie ), work( itauq ),
1399 $ work( itaup ), work( iwork ),
1400 $ lwork-iwork+1, ierr )
1401 CALL slacpy(
'U', n, n, work( iu ), ldwrku, vt,
1407 CALL sorgbr(
'Q', n, n, n, work( iu ), ldwrku,
1408 $ work( itauq ), work( iwork ),
1409 $ lwork-iwork+1, ierr )
1415 CALL sorgbr(
'P', n, n, n, vt, ldvt,
1417 $ work( iwork ), lwork-iwork+1, ierr )
1425 CALL sbdsqr(
'U', n, n, n, 0, s, work( ie ), vt,
1426 $ ldvt, work( iu ), ldwrku, dum, 1,
1427 $ work( iwork ), info )
1433 CALL sgemm(
'N',
'N', m, n, n, one, a, lda,
1434 $ work( iu ), ldwrku, zero, u, ldu )
1446 CALL sgeqrf( m, n, a, lda, work( itau ),
1447 $ work( iwork ), lwork-iwork+1, ierr )
1448 CALL slacpy(
'L', m, n, a, lda, u, ldu )
1453 CALL sorgqr( m, n, n, u, ldu, work( itau ),
1454 $ work( iwork ), lwork-iwork+1, ierr )
1458 CALL slacpy(
'U', n, n, a, lda, vt, ldvt )
1460 $
CALL slaset(
'L', n-1, n-1, zero, zero,
1461 $ vt( 2, 1 ), ldvt )
1470 CALL sgebrd( n, n, vt, ldvt, s, work( ie ),
1471 $ work( itauq ), work( itaup ),
1472 $ work( iwork ), lwork-iwork+1, ierr )
1478 CALL sormbr(
'Q',
'R',
'N', m, n, n, vt, ldvt,
1479 $ work( itauq ), u, ldu, work( iwork ),
1480 $ lwork-iwork+1, ierr )
1485 CALL sorgbr(
'P', n, n, n, vt, ldvt,
1487 $ work( iwork ), lwork-iwork+1, ierr )
1495 CALL sbdsqr(
'U', n, n, m, 0, s, work( ie ), vt,
1496 $ ldvt, u, ldu, dum, 1, work( iwork ),
1503 ELSE IF( wntua )
THEN
1511 IF( lwork.GE.n*n+max( n+m, 4*n, bdspac ) )
THEN
1516 IF( lwork.GE.wrkbl+lda*n )
THEN
1527 itau = ir + ldwrkr*n
1533 CALL sgeqrf( m, n, a, lda, work( itau ),
1534 $ work( iwork ), lwork-iwork+1, ierr )
1535 CALL slacpy(
'L', m, n, a, lda, u, ldu )
1539 CALL slacpy(
'U', n, n, a, lda, work( ir ),
1541 CALL slaset(
'L', n-1, n-1, zero, zero,
1542 $ work( ir+1 ), ldwrkr )
1547 CALL sorgqr( m, m, n, u, ldu, work( itau ),
1548 $ work( iwork ), lwork-iwork+1, ierr )
1557 CALL sgebrd( n, n, work( ir ), ldwrkr, s,
1558 $ work( ie ), work( itauq ),
1559 $ work( itaup ), work( iwork ),
1560 $ lwork-iwork+1, ierr )
1565 CALL sorgbr(
'Q', n, n, n, work( ir ), ldwrkr,
1566 $ work( itauq ), work( iwork ),
1567 $ lwork-iwork+1, ierr )
1574 CALL sbdsqr(
'U', n, 0, n, 0, s, work( ie ),
1576 $ 1, work( ir ), ldwrkr, dum, 1,
1577 $ work( iwork ), info )
1583 CALL sgemm(
'N',
'N', m, n, n, one, u, ldu,
1584 $ work( ir ), ldwrkr, zero, a, lda )
1588 CALL slacpy(
'F', m, n, a, lda, u, ldu )
1600 CALL sgeqrf( m, n, a, lda, work( itau ),
1601 $ work( iwork ), lwork-iwork+1, ierr )
1602 CALL slacpy(
'L', m, n, a, lda, u, ldu )
1607 CALL sorgqr( m, m, n, u, ldu, work( itau ),
1608 $ work( iwork ), lwork-iwork+1, ierr )
1617 CALL slaset(
'L', n-1, n-1, zero, zero,
1624 CALL sgebrd( n, n, a, lda, s, work( ie ),
1625 $ work( itauq ), work( itaup ),
1626 $ work( iwork ), lwork-iwork+1, ierr )
1632 CALL sormbr(
'Q',
'R',
'N', m, n, n, a, lda,
1633 $ work( itauq ), u, ldu, work( iwork ),
1634 $ lwork-iwork+1, ierr )
1641 CALL sbdsqr(
'U', n, 0, m, 0, s, work( ie ),
1643 $ 1, u, ldu, dum, 1, work( iwork ),
1648 ELSE IF( wntvo )
THEN
1654 IF( lwork.GE.2*n*n+max( n+m, 4*n, bdspac ) )
THEN
1659 IF( lwork.GE.wrkbl+2*lda*n )
THEN
1666 ELSE IF( lwork.GE.wrkbl+( lda+n )*n )
THEN
1681 itau = ir + ldwrkr*n
1687 CALL sgeqrf( m, n, a, lda, work( itau ),
1688 $ work( iwork ), lwork-iwork+1, ierr )
1689 CALL slacpy(
'L', m, n, a, lda, u, ldu )
1694 CALL sorgqr( m, m, n, u, ldu, work( itau ),
1695 $ work( iwork ), lwork-iwork+1, ierr )
1699 CALL slacpy(
'U', n, n, a, lda, work( iu ),
1701 CALL slaset(
'L', n-1, n-1, zero, zero,
1702 $ work( iu+1 ), ldwrku )
1713 CALL sgebrd( n, n, work( iu ), ldwrku, s,
1714 $ work( ie ), work( itauq ),
1715 $ work( itaup ), work( iwork ),
1716 $ lwork-iwork+1, ierr )
1717 CALL slacpy(
'U', n, n, work( iu ), ldwrku,
1718 $ work( ir ), ldwrkr )
1723 CALL sorgbr(
'Q', n, n, n, work( iu ), ldwrku,
1724 $ work( itauq ), work( iwork ),
1725 $ lwork-iwork+1, ierr )
1731 CALL sorgbr(
'P', n, n, n, work( ir ), ldwrkr,
1732 $ work( itaup ), work( iwork ),
1733 $ lwork-iwork+1, ierr )
1741 CALL sbdsqr(
'U', n, n, n, 0, s, work( ie ),
1742 $ work( ir ), ldwrkr, work( iu ),
1743 $ ldwrku, dum, 1, work( iwork ), info )
1749 CALL sgemm(
'N',
'N', m, n, n, one, u, ldu,
1750 $ work( iu ), ldwrku, zero, a, lda )
1754 CALL slacpy(
'F', m, n, a, lda, u, ldu )
1758 CALL slacpy(
'F', n, n, work( ir ), ldwrkr, a,
1771 CALL sgeqrf( m, n, a, lda, work( itau ),
1772 $ work( iwork ), lwork-iwork+1, ierr )
1773 CALL slacpy(
'L', m, n, a, lda, u, ldu )
1778 CALL sorgqr( m, m, n, u, ldu, work( itau ),
1779 $ work( iwork ), lwork-iwork+1, ierr )
1788 CALL slaset(
'L', n-1, n-1, zero, zero,
1795 CALL sgebrd( n, n, a, lda, s, work( ie ),
1796 $ work( itauq ), work( itaup ),
1797 $ work( iwork ), lwork-iwork+1, ierr )
1803 CALL sormbr(
'Q',
'R',
'N', m, n, n, a, lda,
1804 $ work( itauq ), u, ldu, work( iwork ),
1805 $ lwork-iwork+1, ierr )
1810 CALL sorgbr(
'P', n, n, n, a, lda,
1812 $ work( iwork ), lwork-iwork+1, ierr )
1820 CALL sbdsqr(
'U', n, n, m, 0, s, work( ie ), a,
1821 $ lda, u, ldu, dum, 1, work( iwork ),
1826 ELSE IF( wntvas )
THEN
1833 IF( lwork.GE.n*n+max( n+m, 4*n, bdspac ) )
THEN
1838 IF( lwork.GE.wrkbl+lda*n )
THEN
1849 itau = iu + ldwrku*n
1855 CALL sgeqrf( m, n, a, lda, work( itau ),
1856 $ work( iwork ), lwork-iwork+1, ierr )
1857 CALL slacpy(
'L', m, n, a, lda, u, ldu )
1862 CALL sorgqr( m, m, n, u, ldu, work( itau ),
1863 $ work( iwork ), lwork-iwork+1, ierr )
1867 CALL slacpy(
'U', n, n, a, lda, work( iu ),
1869 CALL slaset(
'L', n-1, n-1, zero, zero,
1870 $ work( iu+1 ), ldwrku )
1879 CALL sgebrd( n, n, work( iu ), ldwrku, s,
1880 $ work( ie ), work( itauq ),
1881 $ work( itaup ), work( iwork ),
1882 $ lwork-iwork+1, ierr )
1883 CALL slacpy(
'U', n, n, work( iu ), ldwrku, vt,
1889 CALL sorgbr(
'Q', n, n, n, work( iu ), ldwrku,
1890 $ work( itauq ), work( iwork ),
1891 $ lwork-iwork+1, ierr )
1897 CALL sorgbr(
'P', n, n, n, vt, ldvt,
1899 $ work( iwork ), lwork-iwork+1, ierr )
1907 CALL sbdsqr(
'U', n, n, n, 0, s, work( ie ), vt,
1908 $ ldvt, work( iu ), ldwrku, dum, 1,
1909 $ work( iwork ), info )
1915 CALL sgemm(
'N',
'N', m, n, n, one, u, ldu,
1916 $ work( iu ), ldwrku, zero, a, lda )
1920 CALL slacpy(
'F', m, n, a, lda, u, ldu )
1932 CALL sgeqrf( m, n, a, lda, work( itau ),
1933 $ work( iwork ), lwork-iwork+1, ierr )
1934 CALL slacpy(
'L', m, n, a, lda, u, ldu )
1939 CALL sorgqr( m, m, n, u, ldu, work( itau ),
1940 $ work( iwork ), lwork-iwork+1, ierr )
1944 CALL slacpy(
'U', n, n, a, lda, vt, ldvt )
1946 $
CALL slaset(
'L', n-1, n-1, zero, zero,
1947 $ vt( 2, 1 ), ldvt )
1956 CALL sgebrd( n, n, vt, ldvt, s, work( ie ),
1957 $ work( itauq ), work( itaup ),
1958 $ work( iwork ), lwork-iwork+1, ierr )
1964 CALL sormbr(
'Q',
'R',
'N', m, n, n, vt, ldvt,
1965 $ work( itauq ), u, ldu, work( iwork ),
1966 $ lwork-iwork+1, ierr )
1971 CALL sorgbr(
'P', n, n, n, vt, ldvt,
1973 $ work( iwork ), lwork-iwork+1, ierr )
1981 CALL sbdsqr(
'U', n, n, m, 0, s, work( ie ), vt,
1982 $ ldvt, u, ldu, dum, 1, work( iwork ),
2006 CALL sgebrd( m, n, a, lda, s, work( ie ), work( itauq ),
2007 $ work( itaup ), work( iwork ), lwork-iwork+1,
2015 CALL slacpy(
'L', m, n, a, lda, u, ldu )
2020 CALL sorgbr(
'Q', m, ncu, n, u, ldu, work( itauq ),
2021 $ work( iwork ), lwork-iwork+1, ierr )
2029 CALL slacpy(
'U', n, n, a, lda, vt, ldvt )
2030 CALL sorgbr(
'P', n, n, n, vt, ldvt, work( itaup ),
2031 $ work( iwork ), lwork-iwork+1, ierr )
2039 CALL sorgbr(
'Q', m, n, n, a, lda, work( itauq ),
2040 $ work( iwork ), lwork-iwork+1, ierr )
2048 CALL sorgbr(
'P', n, n, n, a, lda, work( itaup ),
2049 $ work( iwork ), lwork-iwork+1, ierr )
2052 IF( wntuas .OR. wntuo )
2056 IF( wntvas .OR. wntvo )
2060 IF( ( .NOT.wntuo ) .AND. ( .NOT.wntvo ) )
THEN
2067 CALL sbdsqr(
'U', n, ncvt, nru, 0, s, work( ie ), vt,
2068 $ ldvt, u, ldu, dum, 1, work( iwork ), info )
2069 ELSE IF( ( .NOT.wntuo ) .AND. wntvo )
THEN
2076 CALL sbdsqr(
'U', n, ncvt, nru, 0, s, work( ie ), a,
2078 $ u, ldu, dum, 1, work( iwork ), info )
2086 CALL sbdsqr(
'U', n, ncvt, nru, 0, s, work( ie ), vt,
2087 $ ldvt, a, lda, dum, 1, work( iwork ), info )
2098 IF( n.GE.mnthr )
THEN
2111 CALL sgelqf( m, n, a, lda, work( itau ),
2113 $ lwork-iwork+1, ierr )
2117 CALL slaset(
'U', m-1, m-1, zero, zero, a( 1, 2 ),
2127 CALL sgebrd( m, m, a, lda, s, work( ie ),
2129 $ work( itaup ), work( iwork ), lwork-iwork+1,
2131 IF( wntuo .OR. wntuas )
THEN
2136 CALL sorgbr(
'Q', m, m, m, a, lda, work( itauq ),
2137 $ work( iwork ), lwork-iwork+1, ierr )
2141 IF( wntuo .OR. wntuas )
2148 CALL sbdsqr(
'U', m, 0, nru, 0, s, work( ie ), dum, 1,
2150 $ lda, dum, 1, work( iwork ), info )
2155 $
CALL slacpy(
'F', m, m, a, lda, u, ldu )
2157 ELSE IF( wntvo .AND. wntun )
THEN
2163 IF( lwork.GE.m*m+max( 4*m, bdspac ) )
THEN
2168 IF( lwork.GE.max( wrkbl, lda*n+m )+lda*m )
THEN
2175 ELSE IF( lwork.GE.max( wrkbl, lda*n+m )+m*m )
THEN
2187 chunk = ( lwork-m*m-m ) / m
2190 itau = ir + ldwrkr*m
2196 CALL sgelqf( m, n, a, lda, work( itau ),
2197 $ work( iwork ), lwork-iwork+1, ierr )
2201 CALL slacpy(
'L', m, m, a, lda, work( ir ),
2203 CALL slaset(
'U', m-1, m-1, zero, zero,
2204 $ work( ir+ldwrkr ), ldwrkr )
2209 CALL sorglq( m, n, m, a, lda, work( itau ),
2210 $ work( iwork ), lwork-iwork+1, ierr )
2219 CALL sgebrd( m, m, work( ir ), ldwrkr, s,
2221 $ work( itauq ), work( itaup ),
2222 $ work( iwork ), lwork-iwork+1, ierr )
2227 CALL sorgbr(
'P', m, m, m, work( ir ), ldwrkr,
2228 $ work( itaup ), work( iwork ),
2229 $ lwork-iwork+1, ierr )
2236 CALL sbdsqr(
'U', m, m, 0, 0, s, work( ie ),
2237 $ work( ir ), ldwrkr, dum, 1, dum, 1,
2238 $ work( iwork ), info )
2245 DO 30 i = 1, n, chunk
2246 blk = min( n-i+1, chunk )
2247 CALL sgemm(
'N',
'N', m, blk, m, one,
2249 $ ldwrkr, a( 1, i ), lda, zero,
2250 $ work( iu ), ldwrku )
2251 CALL slacpy(
'F', m, blk, work( iu ), ldwrku,
2267 CALL sgebrd( m, n, a, lda, s, work( ie ),
2268 $ work( itauq ), work( itaup ),
2269 $ work( iwork ), lwork-iwork+1, ierr )
2274 CALL sorgbr(
'P', m, n, m, a, lda, work( itaup ),
2275 $ work( iwork ), lwork-iwork+1, ierr )
2282 CALL sbdsqr(
'L', m, n, 0, 0, s, work( ie ), a,
2284 $ dum, 1, dum, 1, work( iwork ), info )
2288 ELSE IF( wntvo .AND. wntuas )
THEN
2294 IF( lwork.GE.m*m+max( 4*m, bdspac ) )
THEN
2299 IF( lwork.GE.max( wrkbl, lda*n+m )+lda*m )
THEN
2306 ELSE IF( lwork.GE.max( wrkbl, lda*n+m )+m*m )
THEN
2318 chunk = ( lwork-m*m-m ) / m
2321 itau = ir + ldwrkr*m
2327 CALL sgelqf( m, n, a, lda, work( itau ),
2328 $ work( iwork ), lwork-iwork+1, ierr )
2332 CALL slacpy(
'L', m, m, a, lda, u, ldu )
2333 CALL slaset(
'U', m-1, m-1, zero, zero, u( 1, 2 ),
2339 CALL sorglq( m, n, m, a, lda, work( itau ),
2340 $ work( iwork ), lwork-iwork+1, ierr )
2349 CALL sgebrd( m, m, u, ldu, s, work( ie ),
2350 $ work( itauq ), work( itaup ),
2351 $ work( iwork ), lwork-iwork+1, ierr )
2352 CALL slacpy(
'U', m, m, u, ldu, work( ir ),
2358 CALL sorgbr(
'P', m, m, m, work( ir ), ldwrkr,
2359 $ work( itaup ), work( iwork ),
2360 $ lwork-iwork+1, ierr )
2365 CALL sorgbr(
'Q', m, m, m, u, ldu, work( itauq ),
2366 $ work( iwork ), lwork-iwork+1, ierr )
2374 CALL sbdsqr(
'U', m, m, m, 0, s, work( ie ),
2375 $ work( ir ), ldwrkr, u, ldu, dum, 1,
2376 $ work( iwork ), info )
2383 DO 40 i = 1, n, chunk
2384 blk = min( n-i+1, chunk )
2385 CALL sgemm(
'N',
'N', m, blk, m, one,
2387 $ ldwrkr, a( 1, i ), lda, zero,
2388 $ work( iu ), ldwrku )
2389 CALL slacpy(
'F', m, blk, work( iu ), ldwrku,
2403 CALL sgelqf( m, n, a, lda, work( itau ),
2404 $ work( iwork ), lwork-iwork+1, ierr )
2408 CALL slacpy(
'L', m, m, a, lda, u, ldu )
2409 CALL slaset(
'U', m-1, m-1, zero, zero, u( 1, 2 ),
2415 CALL sorglq( m, n, m, a, lda, work( itau ),
2416 $ work( iwork ), lwork-iwork+1, ierr )
2425 CALL sgebrd( m, m, u, ldu, s, work( ie ),
2426 $ work( itauq ), work( itaup ),
2427 $ work( iwork ), lwork-iwork+1, ierr )
2432 CALL sormbr(
'P',
'L',
'T', m, n, m, u, ldu,
2433 $ work( itaup ), a, lda, work( iwork ),
2434 $ lwork-iwork+1, ierr )
2439 CALL sorgbr(
'Q', m, m, m, u, ldu, work( itauq ),
2440 $ work( iwork ), lwork-iwork+1, ierr )
2448 CALL sbdsqr(
'U', m, n, m, 0, s, work( ie ), a,
2450 $ u, ldu, dum, 1, work( iwork ), info )
2454 ELSE IF( wntvs )
THEN
2462 IF( lwork.GE.m*m+max( 4*m, bdspac ) )
THEN
2467 IF( lwork.GE.wrkbl+lda*m )
THEN
2478 itau = ir + ldwrkr*m
2484 CALL sgelqf( m, n, a, lda, work( itau ),
2485 $ work( iwork ), lwork-iwork+1, ierr )
2489 CALL slacpy(
'L', m, m, a, lda, work( ir ),
2491 CALL slaset(
'U', m-1, m-1, zero, zero,
2492 $ work( ir+ldwrkr ), ldwrkr )
2497 CALL sorglq( m, n, m, a, lda, work( itau ),
2498 $ work( iwork ), lwork-iwork+1, ierr )
2507 CALL sgebrd( m, m, work( ir ), ldwrkr, s,
2508 $ work( ie ), work( itauq ),
2509 $ work( itaup ), work( iwork ),
2510 $ lwork-iwork+1, ierr )
2516 CALL sorgbr(
'P', m, m, m, work( ir ), ldwrkr,
2517 $ work( itaup ), work( iwork ),
2518 $ lwork-iwork+1, ierr )
2525 CALL sbdsqr(
'U', m, m, 0, 0, s, work( ie ),
2526 $ work( ir ), ldwrkr, dum, 1, dum, 1,
2527 $ work( iwork ), info )
2533 CALL sgemm(
'N',
'N', m, n, m, one, work( ir ),
2534 $ ldwrkr, a, lda, zero, vt, ldvt )
2546 CALL sgelqf( m, n, a, lda, work( itau ),
2547 $ work( iwork ), lwork-iwork+1, ierr )
2551 CALL slacpy(
'U', m, n, a, lda, vt, ldvt )
2556 CALL sorglq( m, n, m, vt, ldvt, work( itau ),
2557 $ work( iwork ), lwork-iwork+1, ierr )
2565 CALL slaset(
'U', m-1, m-1, zero, zero, a( 1,
2572 CALL sgebrd( m, m, a, lda, s, work( ie ),
2573 $ work( itauq ), work( itaup ),
2574 $ work( iwork ), lwork-iwork+1, ierr )
2579 CALL sormbr(
'P',
'L',
'T', m, n, m, a, lda,
2580 $ work( itaup ), vt, ldvt,
2581 $ work( iwork ), lwork-iwork+1, ierr )
2588 CALL sbdsqr(
'U', m, n, 0, 0, s, work( ie ), vt,
2589 $ ldvt, dum, 1, dum, 1, work( iwork ),
2594 ELSE IF( wntuo )
THEN
2600 IF( lwork.GE.2*m*m+max( 4*m, bdspac ) )
THEN
2605 IF( lwork.GE.wrkbl+2*lda*m )
THEN
2612 ELSE IF( lwork.GE.wrkbl+( lda+m )*m )
THEN
2627 itau = ir + ldwrkr*m
2633 CALL sgelqf( m, n, a, lda, work( itau ),
2634 $ work( iwork ), lwork-iwork+1, ierr )
2638 CALL slacpy(
'L', m, m, a, lda, work( iu ),
2640 CALL slaset(
'U', m-1, m-1, zero, zero,
2641 $ work( iu+ldwrku ), ldwrku )
2646 CALL sorglq( m, n, m, a, lda, work( itau ),
2647 $ work( iwork ), lwork-iwork+1, ierr )
2658 CALL sgebrd( m, m, work( iu ), ldwrku, s,
2659 $ work( ie ), work( itauq ),
2660 $ work( itaup ), work( iwork ),
2661 $ lwork-iwork+1, ierr )
2662 CALL slacpy(
'L', m, m, work( iu ), ldwrku,
2663 $ work( ir ), ldwrkr )
2669 CALL sorgbr(
'P', m, m, m, work( iu ), ldwrku,
2670 $ work( itaup ), work( iwork ),
2671 $ lwork-iwork+1, ierr )
2676 CALL sorgbr(
'Q', m, m, m, work( ir ), ldwrkr,
2677 $ work( itauq ), work( iwork ),
2678 $ lwork-iwork+1, ierr )
2686 CALL sbdsqr(
'U', m, m, m, 0, s, work( ie ),
2687 $ work( iu ), ldwrku, work( ir ),
2688 $ ldwrkr, dum, 1, work( iwork ), info )
2694 CALL sgemm(
'N',
'N', m, n, m, one, work( iu ),
2695 $ ldwrku, a, lda, zero, vt, ldvt )
2700 CALL slacpy(
'F', m, m, work( ir ), ldwrkr, a,
2713 CALL sgelqf( m, n, a, lda, work( itau ),
2714 $ work( iwork ), lwork-iwork+1, ierr )
2715 CALL slacpy(
'U', m, n, a, lda, vt, ldvt )
2720 CALL sorglq( m, n, m, vt, ldvt, work( itau ),
2721 $ work( iwork ), lwork-iwork+1, ierr )
2729 CALL slaset(
'U', m-1, m-1, zero, zero, a( 1,
2736 CALL sgebrd( m, m, a, lda, s, work( ie ),
2737 $ work( itauq ), work( itaup ),
2738 $ work( iwork ), lwork-iwork+1, ierr )
2743 CALL sormbr(
'P',
'L',
'T', m, n, m, a, lda,
2744 $ work( itaup ), vt, ldvt,
2745 $ work( iwork ), lwork-iwork+1, ierr )
2750 CALL sorgbr(
'Q', m, m, m, a, lda,
2752 $ work( iwork ), lwork-iwork+1, ierr )
2760 CALL sbdsqr(
'U', m, n, m, 0, s, work( ie ), vt,
2761 $ ldvt, a, lda, dum, 1, work( iwork ),
2766 ELSE IF( wntuas )
THEN
2773 IF( lwork.GE.m*m+max( 4*m, bdspac ) )
THEN
2778 IF( lwork.GE.wrkbl+lda*m )
THEN
2789 itau = iu + ldwrku*m
2795 CALL sgelqf( m, n, a, lda, work( itau ),
2796 $ work( iwork ), lwork-iwork+1, ierr )
2800 CALL slacpy(
'L', m, m, a, lda, work( iu ),
2802 CALL slaset(
'U', m-1, m-1, zero, zero,
2803 $ work( iu+ldwrku ), ldwrku )
2808 CALL sorglq( m, n, m, a, lda, work( itau ),
2809 $ work( iwork ), lwork-iwork+1, ierr )
2818 CALL sgebrd( m, m, work( iu ), ldwrku, s,
2819 $ work( ie ), work( itauq ),
2820 $ work( itaup ), work( iwork ),
2821 $ lwork-iwork+1, ierr )
2822 CALL slacpy(
'L', m, m, work( iu ), ldwrku, u,
2829 CALL sorgbr(
'P', m, m, m, work( iu ), ldwrku,
2830 $ work( itaup ), work( iwork ),
2831 $ lwork-iwork+1, ierr )
2836 CALL sorgbr(
'Q', m, m, m, u, ldu,
2838 $ work( iwork ), lwork-iwork+1, ierr )
2846 CALL sbdsqr(
'U', m, m, m, 0, s, work( ie ),
2847 $ work( iu ), ldwrku, u, ldu, dum, 1,
2848 $ work( iwork ), info )
2854 CALL sgemm(
'N',
'N', m, n, m, one, work( iu ),
2855 $ ldwrku, a, lda, zero, vt, ldvt )
2867 CALL sgelqf( m, n, a, lda, work( itau ),
2868 $ work( iwork ), lwork-iwork+1, ierr )
2869 CALL slacpy(
'U', m, n, a, lda, vt, ldvt )
2874 CALL sorglq( m, n, m, vt, ldvt, work( itau ),
2875 $ work( iwork ), lwork-iwork+1, ierr )
2879 CALL slacpy(
'L', m, m, a, lda, u, ldu )
2880 CALL slaset(
'U', m-1, m-1, zero, zero, u( 1,
2891 CALL sgebrd( m, m, u, ldu, s, work( ie ),
2892 $ work( itauq ), work( itaup ),
2893 $ work( iwork ), lwork-iwork+1, ierr )
2899 CALL sormbr(
'P',
'L',
'T', m, n, m, u, ldu,
2900 $ work( itaup ), vt, ldvt,
2901 $ work( iwork ), lwork-iwork+1, ierr )
2906 CALL sorgbr(
'Q', m, m, m, u, ldu,
2908 $ work( iwork ), lwork-iwork+1, ierr )
2916 CALL sbdsqr(
'U', m, n, m, 0, s, work( ie ), vt,
2917 $ ldvt, u, ldu, dum, 1, work( iwork ),
2924 ELSE IF( wntva )
THEN
2932 IF( lwork.GE.m*m+max( n+m, 4*m, bdspac ) )
THEN
2937 IF( lwork.GE.wrkbl+lda*m )
THEN
2948 itau = ir + ldwrkr*m
2954 CALL sgelqf( m, n, a, lda, work( itau ),
2955 $ work( iwork ), lwork-iwork+1, ierr )
2956 CALL slacpy(
'U', m, n, a, lda, vt, ldvt )
2960 CALL slacpy(
'L', m, m, a, lda, work( ir ),
2962 CALL slaset(
'U', m-1, m-1, zero, zero,
2963 $ work( ir+ldwrkr ), ldwrkr )
2968 CALL sorglq( n, n, m, vt, ldvt, work( itau ),
2969 $ work( iwork ), lwork-iwork+1, ierr )
2978 CALL sgebrd( m, m, work( ir ), ldwrkr, s,
2979 $ work( ie ), work( itauq ),
2980 $ work( itaup ), work( iwork ),
2981 $ lwork-iwork+1, ierr )
2987 CALL sorgbr(
'P', m, m, m, work( ir ), ldwrkr,
2988 $ work( itaup ), work( iwork ),
2989 $ lwork-iwork+1, ierr )
2996 CALL sbdsqr(
'U', m, m, 0, 0, s, work( ie ),
2997 $ work( ir ), ldwrkr, dum, 1, dum, 1,
2998 $ work( iwork ), info )
3004 CALL sgemm(
'N',
'N', m, n, m, one, work( ir ),
3005 $ ldwrkr, vt, ldvt, zero, a, lda )
3009 CALL slacpy(
'F', m, n, a, lda, vt, ldvt )
3021 CALL sgelqf( m, n, a, lda, work( itau ),
3022 $ work( iwork ), lwork-iwork+1, ierr )
3023 CALL slacpy(
'U', m, n, a, lda, vt, ldvt )
3028 CALL sorglq( n, n, m, vt, ldvt, work( itau ),
3029 $ work( iwork ), lwork-iwork+1, ierr )
3037 CALL slaset(
'U', m-1, m-1, zero, zero, a( 1,
3044 CALL sgebrd( m, m, a, lda, s, work( ie ),
3045 $ work( itauq ), work( itaup ),
3046 $ work( iwork ), lwork-iwork+1, ierr )
3052 CALL sormbr(
'P',
'L',
'T', m, n, m, a, lda,
3053 $ work( itaup ), vt, ldvt,
3054 $ work( iwork ), lwork-iwork+1, ierr )
3061 CALL sbdsqr(
'U', m, n, 0, 0, s, work( ie ), vt,
3062 $ ldvt, dum, 1, dum, 1, work( iwork ),
3067 ELSE IF( wntuo )
THEN
3073 IF( lwork.GE.2*m*m+max( n+m, 4*m, bdspac ) )
THEN
3078 IF( lwork.GE.wrkbl+2*lda*m )
THEN
3085 ELSE IF( lwork.GE.wrkbl+( lda+m )*m )
THEN
3100 itau = ir + ldwrkr*m
3106 CALL sgelqf( m, n, a, lda, work( itau ),
3107 $ work( iwork ), lwork-iwork+1, ierr )
3108 CALL slacpy(
'U', m, n, a, lda, vt, ldvt )
3113 CALL sorglq( n, n, m, vt, ldvt, work( itau ),
3114 $ work( iwork ), lwork-iwork+1, ierr )
3118 CALL slacpy(
'L', m, m, a, lda, work( iu ),
3120 CALL slaset(
'U', m-1, m-1, zero, zero,
3121 $ work( iu+ldwrku ), ldwrku )
3132 CALL sgebrd( m, m, work( iu ), ldwrku, s,
3133 $ work( ie ), work( itauq ),
3134 $ work( itaup ), work( iwork ),
3135 $ lwork-iwork+1, ierr )
3136 CALL slacpy(
'L', m, m, work( iu ), ldwrku,
3137 $ work( ir ), ldwrkr )
3143 CALL sorgbr(
'P', m, m, m, work( iu ), ldwrku,
3144 $ work( itaup ), work( iwork ),
3145 $ lwork-iwork+1, ierr )
3150 CALL sorgbr(
'Q', m, m, m, work( ir ), ldwrkr,
3151 $ work( itauq ), work( iwork ),
3152 $ lwork-iwork+1, ierr )
3160 CALL sbdsqr(
'U', m, m, m, 0, s, work( ie ),
3161 $ work( iu ), ldwrku, work( ir ),
3162 $ ldwrkr, dum, 1, work( iwork ), info )
3168 CALL sgemm(
'N',
'N', m, n, m, one, work( iu ),
3169 $ ldwrku, vt, ldvt, zero, a, lda )
3173 CALL slacpy(
'F', m, n, a, lda, vt, ldvt )
3177 CALL slacpy(
'F', m, m, work( ir ), ldwrkr, a,
3190 CALL sgelqf( m, n, a, lda, work( itau ),
3191 $ work( iwork ), lwork-iwork+1, ierr )
3192 CALL slacpy(
'U', m, n, a, lda, vt, ldvt )
3197 CALL sorglq( n, n, m, vt, ldvt, work( itau ),
3198 $ work( iwork ), lwork-iwork+1, ierr )
3206 CALL slaset(
'U', m-1, m-1, zero, zero, a( 1,
3213 CALL sgebrd( m, m, a, lda, s, work( ie ),
3214 $ work( itauq ), work( itaup ),
3215 $ work( iwork ), lwork-iwork+1, ierr )
3221 CALL sormbr(
'P',
'L',
'T', m, n, m, a, lda,
3222 $ work( itaup ), vt, ldvt,
3223 $ work( iwork ), lwork-iwork+1, ierr )
3228 CALL sorgbr(
'Q', m, m, m, a, lda,
3230 $ work( iwork ), lwork-iwork+1, ierr )
3238 CALL sbdsqr(
'U', m, n, m, 0, s, work( ie ), vt,
3239 $ ldvt, a, lda, dum, 1, work( iwork ),
3244 ELSE IF( wntuas )
THEN
3251 IF( lwork.GE.m*m+max( n+m, 4*m, bdspac ) )
THEN
3256 IF( lwork.GE.wrkbl+lda*m )
THEN
3267 itau = iu + ldwrku*m
3273 CALL sgelqf( m, n, a, lda, work( itau ),
3274 $ work( iwork ), lwork-iwork+1, ierr )
3275 CALL slacpy(
'U', m, n, a, lda, vt, ldvt )
3280 CALL sorglq( n, n, m, vt, ldvt, work( itau ),
3281 $ work( iwork ), lwork-iwork+1, ierr )
3285 CALL slacpy(
'L', m, m, a, lda, work( iu ),
3287 CALL slaset(
'U', m-1, m-1, zero, zero,
3288 $ work( iu+ldwrku ), ldwrku )
3297 CALL sgebrd( m, m, work( iu ), ldwrku, s,
3298 $ work( ie ), work( itauq ),
3299 $ work( itaup ), work( iwork ),
3300 $ lwork-iwork+1, ierr )
3301 CALL slacpy(
'L', m, m, work( iu ), ldwrku, u,
3307 CALL sorgbr(
'P', m, m, m, work( iu ), ldwrku,
3308 $ work( itaup ), work( iwork ),
3309 $ lwork-iwork+1, ierr )
3314 CALL sorgbr(
'Q', m, m, m, u, ldu,
3316 $ work( iwork ), lwork-iwork+1, ierr )
3324 CALL sbdsqr(
'U', m, m, m, 0, s, work( ie ),
3325 $ work( iu ), ldwrku, u, ldu, dum, 1,
3326 $ work( iwork ), info )
3332 CALL sgemm(
'N',
'N', m, n, m, one, work( iu ),
3333 $ ldwrku, vt, ldvt, zero, a, lda )
3337 CALL slacpy(
'F', m, n, a, lda, vt, ldvt )
3349 CALL sgelqf( m, n, a, lda, work( itau ),
3350 $ work( iwork ), lwork-iwork+1, ierr )
3351 CALL slacpy(
'U', m, n, a, lda, vt, ldvt )
3356 CALL sorglq( n, n, m, vt, ldvt, work( itau ),
3357 $ work( iwork ), lwork-iwork+1, ierr )
3361 CALL slacpy(
'L', m, m, a, lda, u, ldu )
3362 CALL slaset(
'U', m-1, m-1, zero, zero, u( 1,
3373 CALL sgebrd( m, m, u, ldu, s, work( ie ),
3374 $ work( itauq ), work( itaup ),
3375 $ work( iwork ), lwork-iwork+1, ierr )
3381 CALL sormbr(
'P',
'L',
'T', m, n, m, u, ldu,
3382 $ work( itaup ), vt, ldvt,
3383 $ work( iwork ), lwork-iwork+1, ierr )
3388 CALL sorgbr(
'Q', m, m, m, u, ldu,
3390 $ work( iwork ), lwork-iwork+1, ierr )
3398 CALL sbdsqr(
'U', m, n, m, 0, s, work( ie ), vt,
3399 $ ldvt, u, ldu, dum, 1, work( iwork ),
3423 CALL sgebrd( m, n, a, lda, s, work( ie ), work( itauq ),
3424 $ work( itaup ), work( iwork ), lwork-iwork+1,
3432 CALL slacpy(
'L', m, m, a, lda, u, ldu )
3433 CALL sorgbr(
'Q', m, m, n, u, ldu, work( itauq ),
3434 $ work( iwork ), lwork-iwork+1, ierr )
3442 CALL slacpy(
'U', m, n, a, lda, vt, ldvt )
3447 CALL sorgbr(
'P', nrvt, n, m, vt, ldvt, work( itaup ),
3448 $ work( iwork ), lwork-iwork+1, ierr )
3456 CALL sorgbr(
'Q', m, m, n, a, lda, work( itauq ),
3457 $ work( iwork ), lwork-iwork+1, ierr )
3465 CALL sorgbr(
'P', m, n, m, a, lda, work( itaup ),
3466 $ work( iwork ), lwork-iwork+1, ierr )
3469 IF( wntuas .OR. wntuo )
3473 IF( wntvas .OR. wntvo )
3477 IF( ( .NOT.wntuo ) .AND. ( .NOT.wntvo ) )
THEN
3484 CALL sbdsqr(
'L', m, ncvt, nru, 0, s, work( ie ), vt,
3485 $ ldvt, u, ldu, dum, 1, work( iwork ), info )
3486 ELSE IF( ( .NOT.wntuo ) .AND. wntvo )
THEN
3493 CALL sbdsqr(
'L', m, ncvt, nru, 0, s, work( ie ), a,
3495 $ u, ldu, dum, 1, work( iwork ), info )
3503 CALL sbdsqr(
'L', m, ncvt, nru, 0, s, work( ie ), vt,
3504 $ ldvt, a, lda, dum, 1, work( iwork ), info )
3514 IF( info.NE.0 )
THEN
3516 DO 50 i = 1, minmn - 1
3517 work( i+1 ) = work( i+ie-1 )
3521 DO 60 i = minmn - 1, 1, -1
3522 work( i+1 ) = work( i+ie-1 )
3529 IF( iscl.EQ.1 )
THEN
3530 IF( anrm.GT.bignum )
3531 $
CALL slascl(
'G', 0, 0, bignum, anrm, minmn, 1, s, minmn,
3533 IF( info.NE.0 .AND. anrm.GT.bignum )
3534 $
CALL slascl(
'G', 0, 0, bignum, anrm, minmn-1, 1,
3537 IF( anrm.LT.smlnum )
3538 $
CALL slascl(
'G', 0, 0, smlnum, anrm, minmn, 1, s, minmn,
3540 IF( info.NE.0 .AND. anrm.LT.smlnum )
3541 $
CALL slascl(
'G', 0, 0, smlnum, anrm, minmn-1, 1,
3548 work( 1 ) = sroundup_lwork(maxwrk)