209 SUBROUTINE sgesvd( JOBU, JOBVT, M, N, A, LDA, S, U, LDU, VT, LDVT,
210 $ WORK, LWORK, INFO )
217 CHARACTER JOBU, JOBVT
218 INTEGER , LDA, LDU, 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, WNTUN, WNTUO, WNTUS,
233 $ wntva, wntvas, wntvn, wntvo, wntvs
234 INTEGER BDSPAC, BLK, CHUNK, I, IE, IERR, IR, ISCL,
235 $ itau, itaup, itauq, iu, iwork, ldwrkr, ldwrku,
236 $ maxwrk, minmn, minwrk, mnthr, ncu, ncvt, nru,
240 $ lwork_sgelqf, lwork_sorglq_n, lwork_sorglq_m
241 REAL ANRM, BIGNUM, EPS, SMLNUM
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( 1, m ) )
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 )
435 wrkbl =
max( wrkbl, 3*n+lwork_sorgbr_q )
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 )
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 )
464 maxwrk =
max( maxwrk, bdspac )
465 minwrk =
max( 3*n+m, bdspac )
467 ELSE IF( 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),
484 lwork_sgebrd = int( dum(1) )
486 CALL sorgbr(
'P', m, m, m, a, n, dum(1),
488 lwork_sorgbr_p = int( 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),
620 lwork_sorgbr_p = int( 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 ),
706 $ work( itaup ), work( iwork ), lwork-iwork+1,
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
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 ELSE IF( wntuo .AND. wntvas )
THEN
862 IF( lwork.GE.n*n+
max( 4*n, bdspac ) )
THEN
867 IF( lwork.GE.
max( wrkbl, lda*n+n )+lda*n )
THEN
873 ELSE IF( lwork.GE.
max( wrkbl, lda*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 )
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 IF( lwork.GE.n*n+
max( 4*n, bdspac ) )
THEN
1031 IF( lwork.GE.wrkbl+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
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 IF( lwork.GE.2*n*n+
max( 4*n, bdspac ) )
THEN
1166 IF( lwork.GE.wrkbl+2*lda*n )
THEN
1173 ELSE IF( lwork.GE.wrkbl+( 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.GE.
IF( LWORKN*N+MAX( 4*N, BDSPAC ) ) THEN
1339.GE.
IF( LWORKWRKBL+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 )
1451 CALL SGEBRD( N, N, VT, LDVT, S, WORK( IE ),
1452 $ WORK( ITAUQ ), WORK( ITAUP ),
1453 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1459 CALL SORMBR( 'q
', 'r
', 'n
', M, N, N, VT, LDVT,
1460 $ WORK( ITAUQ ), U, LDU, WORK( IWORK ),
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.GE.
IF( LWORKN*N+MAX( N+M, 4*N, BDSPAC ) ) THEN
1496.GE.
IF( LWORKWRKBL+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,
1556 $ WORK( IWORK ), INFO )
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.GE.
IF( LWORK2*N*N+MAX( N+M, 4*N, BDSPAC ) ) THEN
1637.GE.
IF( LWORKWRKBL+2*LDA*N ) THEN
1644.GE.
ELSE IF( LWORKWRKBL+( 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 IF( wntuo .OR. wntuas )
THEN
2107 CALL sorgbr(
'Q', m, m, m, a, lda, work( itauq ),
2108 $ work( iwork ), lwork-iwork+1, ierr )
2112 IF( wntuo .OR. 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 ELSE IF( wntvo .AND. wntun )
THEN
2133 IF( lwork.GE.m*m+
max( 4*m, bdspac ) )
THEN
2138 IF( lwork.GE.
max( wrkbl, lda*n+m )+lda*m )
THEN
2145 ELSE IF( lwork.GE.
max( 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 ELSE IF( wntvo .AND. wntuas )
THEN
2260 IF( lwork.GE.m*m+
max( 4*m, bdspac ) )
THEN
2265 IF( lwork.GE.
max( wrkbl, lda*n+m )+lda*m )
THEN
2272 ELSE IF( lwork.GE.
max( 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, work( ir ),
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 IF( lwork.GE.2*m*m+
max( 4*m, bdspac ) )
THEN
2567 IF( lwork.GE.wrkbl+2*lda*m )
THEN
2574 ELSE IF( lwork.GE.wrkbl+( 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 IF( lwork.GE.m*m+
max( 4*m, bdspac ) )
THEN
2738 IF( lwork.GE.wrkbl+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 IF( lwork.GE.m*m+
max( n+m, 4*m, bdspac ) )
THEN
2894 IF( lwork.GE.wrkbl+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 ),
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 ),
3002 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
3008 CALL SORMBR( 'p
', 'l
', 't
', M, N, M, A, LDA,
3009 $ WORK( ITAUP ), VT, LDVT,
3010 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
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.GE.
IF( LWORK2*M*M+MAX( N+M, 4*M, BDSPAC ) ) THEN
3034.GE.
IF( LWORKWRKBL+2*LDA*M ) THEN
3041.GE.
ELSE IF( LWORKWRKBL+( 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.GE.
IF( LWORKM*M+MAX( N+M, 4*M, BDSPAC ) ) THEN
3210.GE.
IF( LWORKWRKBL+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.OR.
IF( WNTUAS WNTUO )
3424.OR.
IF( WNTVAS WNTVO )
3428.NOT..AND..NOT.
IF( ( WNTUO ) ( WNTVO ) ) THEN
3435 CALL SBDSQR( 'l
', M, NCVT, NRU, 0, S, WORK( IE ), VT,
3436 $ LDVT, U, LDU, DUM, 1, WORK( IWORK ), INFO )
3437.NOT..AND.
ELSE IF( ( WNTUO ) 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.NE.
IF( INFO0 ) 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.EQ.
IF( ISCL1 ) THEN
3480.GT.
IF( ANRMBIGNUM )
3481 $ CALL SLASCL( 'g
', 0, 0, BIGNUM, ANRM, MINMN, 1, S, MINMN,
3483.NE..AND..GT.
IF( INFO0 ANRMBIGNUM )
3484 $ CALL SLASCL( 'g
', 0, 0, BIGNUM, ANRM, MINMN-1, 1, WORK( 2 ),
3486.LT.
IF( ANRMSMLNUM )
3487 $ CALL SLASCL( 'g
', 0, 0, SMLNUM, ANRM, MINMN, 1, S, MINMN,
3489.NE..AND..LT.
IF( INFO0 ANRMSMLNUM )
3490 $ CALL SLASCL( 'g
', 0, 0, SMLNUM, ANRM, MINMN-1, 1, WORK( 2 ),