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