217 SUBROUTINE dgesdd( JOBZ, M, N, A, LDA, S, U, LDU, VT, LDVT,
218 $ WORK, LWORK, IWORK, INFO )
227 INTEGER INFO, LDA, LDU, LDVT, LWORK, M, N
231 DOUBLE PRECISION A( LDA, * ), S( * ), U( LDU, * ),
232 $ vt( ldvt, * ), work( * )
238 DOUBLE PRECISION ZERO, ONE
239 parameter( zero = 0.0d0, one = 1.0d0 )
242 LOGICAL LQUERY, WNTQA, WNTQAS, WNTQN, WNTQO, WNTQS
243 INTEGER BDSPAC, BLK, CHUNK, I, IE, IERR, IL,
244 $ ir, iscl, itau, itaup, itauq, iu, ivt, ldwkvt,
245 $ ldwrkl, ldwrkr, ldwrku, maxwrk, minmn, minwrk,
246 $ mnthr, nwork, wrkbl
247 INTEGER LWORK_DGEBRD_MN, LWORK_DGEBRD_MM,
248 $ lwork_dgebrd_nn, lwork_dgelqf_mn,
250 $ lwork_dorgbr_p_mm, lwork_dorgbr_q_nn,
251 $ lwork_dorglq_mn, lwork_dorglq_nn,
252 $ lwork_dorgqr_mm, lwork_dorgqr_mn,
253 $ lwork_dormbr_prt_mm, lwork_dormbr_qln_mm,
254 $ lwork_dormbr_prt_mn, lwork_dormbr_qln_mn,
255 $ lwork_dormbr_prt_nn, lwork_dormbr_qln_nn
256 DOUBLE PRECISION ANRM, BIGNUM, EPS, SMLNUM
260 DOUBLE PRECISION DUM( 1 )
268 LOGICAL LSAME, DISNAN
269 DOUBLE PRECISION DLAMCH, DLANGE, DROUNDUP_LWORK
270 EXTERNAL dlamch, dlange, lsame, disnan,
274 INTRINSIC int,
max,
min, sqrt
282 wntqa = lsame( jobz,
'A' )
283 wntqs = lsame( jobz,
'S' )
284 wntqas = wntqa .OR. wntqs
285 wntqo = lsame( jobz,
'O' )
286 wntqn = lsame( jobz,
'N' )
287 lquery = ( lwork.EQ.-1 )
289 IF( .NOT.( wntqa .OR. wntqs .OR. wntqo .OR. wntqn ) )
THEN
291 ELSE IF( m.LT.0 )
THEN
293 ELSE IF( n.LT.0 )
THEN
295 ELSE IF( lda.LT.
max( 1, m ) )
THEN
297 ELSE IF( ldu.LT.1 .OR. ( wntqas .AND. ldu.LT.m ) .OR.
298 $ ( wntqo .AND. m.LT.n .AND. ldu.LT.m ) )
THEN
300 ELSE IF( ldvt.LT.1 .OR. ( wntqa .AND. ldvt.LT.n ) .OR.
301 $ ( wntqs .AND. ldvt.LT.minmn ) .OR.
302 $ ( wntqo .AND. m.GE.n .AND. ldvt.LT.n ) )
THEN
317 mnthr = int( minmn*11.0d0 / 6.0d0 )
318 IF( m.GE.n .AND. minmn.GT.0 )
THEN
331 CALL dgebrd( m, n, dum(1), m, dum(1), dum(1), dum(1),
332 $ dum(1), dum(1), -1, ierr )
333 lwork_dgebrd_mn = int( dum(1) )
335 CALL dgebrd( n, n, dum(1), n, dum(1), dum(1), dum(1),
336 $ dum(1), dum(1), -1, ierr )
337 lwork_dgebrd_nn = int( dum(1) )
339 CALL dgeqrf( m, n, dum(1), m, dum(1), dum(1), -1, ierr )
340 lwork_dgeqrf_mn = int( dum(1) )
342 CALL dorgbr(
'Q', n, n, n, dum(1), n, dum(1), dum(1), -1,
344 lwork_dorgbr_q_nn = int( dum(1) )
346 CALL dorgqr( m, m, n, dum(1), m, dum(1), dum(1), -1, ierr )
347 lwork_dorgqr_mm = int( dum(1) )
349 CALL dorgqr( m, n, n, dum(1), m, dum(1), dum(1), -1, ierr )
350 lwork_dorgqr_mn = int( dum(1) )
352 CALL dormbr(
'P',
'R',
'T', n, n, n, dum(1), n,
353 $ dum(1), dum(1), n, dum(1), -1, ierr )
354 lwork_dormbr_prt_nn = int( dum(1) )
356 CALL dormbr(
'Q',
'L',
'N', n, n, n, dum(1), n,
357 $ dum(1), dum(1), n, dum(1), -1, ierr )
358 lwork_dormbr_qln_nn = int( dum(1) )
360 CALL dormbr(
'Q',
'L',
'N', m, n, n, dum(1), m,
361 $ dum(1), dum(1), m, dum(1), -1, ierr )
362 lwork_dormbr_qln_mn = int( dum(1) )
364 CALL dormbr(
'Q',
'L',
'N', m, m, n, dum(1), m,
365 $ dum(1), dum(1), m, dum(1), -1, ierr )
366 lwork_dormbr_qln_mm = int( dum(1) )
368 IF( m.GE.mnthr )
THEN
373 wrkbl = n + lwork_dgeqrf_mn
374 wrkbl =
max( wrkbl, 3*n + lwork_dgebrd_nn )
375 maxwrk =
max( wrkbl, bdspac + n )
377 ELSE IF( wntqo )
THEN
381 wrkbl = n + lwork_dgeqrf_mn
382 wrkbl =
max( wrkbl, n + lwork_dorgqr_mn )
383 wrkbl =
max( wrkbl, 3*n + lwork_dgebrd_nn )
384 wrkbl =
max( wrkbl, 3*n + lwork_dormbr_qln_nn )
385 wrkbl =
max( wrkbl, 3*n + lwork_dormbr_prt_nn )
386 wrkbl =
max( wrkbl, 3*n + bdspac )
387 maxwrk = wrkbl + 2*n*n
389 ELSE IF( wntqs )
THEN
393 wrkbl = n + lwork_dgeqrf_mn
394 wrkbl =
max( wrkbl, n + lwork_dorgqr_mn )
395 wrkbl =
max( wrkbl, 3*n + lwork_dgebrd_nn )
396 wrkbl =
max( wrkbl, 3*n + lwork_dormbr_qln_nn )
397 wrkbl =
max( wrkbl, 3*n + lwork_dormbr_prt_nn )
400 minwrk = bdspac + n*n + 3*n
401 ELSE IF( wntqa )
THEN
405 wrkbl = n + lwork_dgeqrf_mn
406 wrkbl =
max( wrkbl, n + lwork_dorgqr_mm )
407 wrkbl =
max( wrkbl, 3*n + lwork_dgebrd_nn
408 wrkbl =
max( wrkbl, 3*n + lwork_dormbr_qln_nn )
409 wrkbl =
max( wrkbl, 3*n + lwork_dormbr_prt_nn )
410 wrkbl =
max( wrkbl, 3*n + bdspac )
412 minwrk = n*n +
max( 3*n + bdspac, n + m )
418 wrkbl = 3*n + lwork_dgebrd_mn
421 maxwrk =
max( wrkbl, 3*n + bdspac )
422 minwrk = 3*n +
max( m, bdspac )
423 ELSE IF( wntqo )
THEN
425 wrkbl =
max( wrkbl, 3*n + lwork_dormbr_prt_nn )
426 wrkbl =
max( wrkbl, 3*n + lwork_dormbr_qln_mn )
427 wrkbl =
max( wrkbl, 3*n + bdspac )
429 minwrk = 3*n +
max( m, n*n + bdspac )
430 ELSE IF( wntqs )
THEN
432 wrkbl =
max( wrkbl, 3*n + lwork_dormbr_qln_mn )
433 wrkbl =
max( wrkbl, 3*n + lwork_dormbr_prt_nn )
434 maxwrk =
max( wrkbl, 3*n + bdspac )
435 minwrk = 3*n +
max( m, bdspac )
436 ELSE IF( wntqa )
THEN
438 wrkbl =
max( wrkbl, 3*n + lwork_dormbr_qln_mm )
439 wrkbl =
max( wrkbl, 3*n + lwork_dormbr_prt_nn )
440 maxwrk =
max( wrkbl, 3*n + bdspac )
441 minwrk = 3*n +
max( m, bdspac )
444 ELSE IF( minmn.GT.0 )
THEN
457 CALL dgebrd( m, n, dum(1), m, dum(1), dum(1), dum(1),
458 $ dum(1), dum(1), -1, ierr )
459 lwork_dgebrd_mn = int( dum(1) )
461 CALL dgebrd( m, m, a, m, s, dum(1), dum(1),
462 $ dum(1), dum(1), -1, ierr )
463 lwork_dgebrd_mm = int( dum(1) )
465 CALL dgelqf( m, n, a, m, dum(1), dum(1), -1, ierr )
466 lwork_dgelqf_mn = int( dum(1) )
468 CALL dorglq( n, n, m, dum(1), n, dum(1), dum(1), -1, ierr )
469 lwork_dorglq_nn = int( dum(1) )
471 CALL dorglq( m, n, m, a, m, dum(1), dum(1), -1, ierr )
472 lwork_dorglq_mn = int( dum(1) )
474 CALL dorgbr(
'P', m, m, m, a, n, dum(1), dum(1), -1, ierr )
475 lwork_dorgbr_p_mm = int( dum(1) )
477 CALL dormbr(
'P',
'R',
'T', m, m, m, dum(1), m,
478 $ dum(1), dum(1), m, dum(1), -1, ierr )
479 lwork_dormbr_prt_mm = int( dum(1) )
481 CALL dormbr(
'P',
'R',
'T', m, n, m, dum(1), m,
482 $ dum(1), dum(1), m, dum(1), -1, ierr )
483 lwork_dormbr_prt_mn = int( dum(1) )
485 CALL dormbr(
'P',
'R',
'T', n, n, m, dum(1), n,
486 $ dum(1), dum(1), n, dum(1), -1, ierr )
487 lwork_dormbr_prt_nn = int( dum(1) )
489 CALL dormbr(
'Q',
'L',
'N', m, m, m, dum(1), m,
490 $ dum(1), dum(1), m, dum(1), -1, ierr )
491 lwork_dormbr_qln_mm = int( dum(1) )
493 IF( n.GE.mnthr )
THEN
498 wrkbl = m + lwork_dgelqf_mn
499 wrkbl =
max( wrkbl, 3*m + lwork_dgebrd_mm )
500 maxwrk =
max( wrkbl, bdspac + m )
502 ELSE IF( wntqo )
THEN
506 wrkbl = m + lwork_dgelqf_mn
507 wrkbl =
max( wrkbl, m + lwork_dorglq_mn )
508 wrkbl =
max( wrkbl, 3*m + lwork_dgebrd_mm )
509 wrkbl =
max( wrkbl, 3*m + lwork_dormbr_qln_mm )
510 wrkbl =
max( wrkbl, 3*m + lwork_dormbr_prt_mm )
511 wrkbl =
max( wrkbl, 3*m + bdspac )
512 maxwrk = wrkbl + 2*m*m
513 minwrk = bdspac + 2*m*m + 3*m
514 ELSE IF( wntqs )
THEN
518 wrkbl = m + lwork_dgelqf_mn
519 wrkbl =
max( wrkbl, m + lwork_dorglq_mn )
520 wrkbl =
max( wrkbl, 3*m + lwork_dgebrd_mm )
521 wrkbl =
max( wrkbl, 3*m + lwork_dormbr_qln_mm )
522 wrkbl =
max( wrkbl, 3*m + lwork_dormbr_prt_mm )
523 wrkbl =
max( wrkbl, 3*m + bdspac )
525 minwrk = bdspac + m*m + 3*m
526 ELSE IF( wntqa )
THEN
530 wrkbl = m + lwork_dgelqf_mn
531 wrkbl =
max( wrkbl, m + lwork_dorglq_nn )
532 wrkbl =
max( wrkbl, 3*m + lwork_dgebrd_mm )
533 wrkbl =
max( wrkbl, 3*m + lwork_dormbr_qln_mm )
534 wrkbl =
max( wrkbl, 3*m + lwork_dormbr_prt_mm )
535 wrkbl =
max( wrkbl, 3*m + bdspac )
537 minwrk = m*m +
max( 3*m + bdspac, m + n )
543 wrkbl = 3*m + lwork_dgebrd_mn
546 maxwrk =
max( wrkbl, 3*m + bdspac )
547 minwrk = 3*m +
max( n, bdspac )
548 ELSE IF( wntqo )
THEN
550 wrkbl =
max( wrkbl, 3*m + lwork_dormbr_qln_mm )
551 wrkbl =
max( wrkbl, 3*m + lwork_dormbr_prt_mn )
552 wrkbl =
max( wrkbl, 3*m + bdspac )
554 minwrk = 3*m +
max( n, m*m + bdspac )
555 ELSE IF( wntqs )
THEN
557 wrkbl =
max( wrkbl, 3*m + lwork_dormbr_qln_mm )
558 wrkbl =
max( wrkbl, 3*m + lwork_dormbr_prt_mn )
559 maxwrk =
max( wrkbl, 3*m + bdspac )
560 minwrk = 3*m +
max( n, bdspac )
561 ELSE IF( wntqa )
THEN
563 wrkbl =
max( wrkbl, 3*m + lwork_dormbr_qln_mm )
564 wrkbl =
max( wrkbl, 3*m + lwork_dormbr_prt_nn )
565 maxwrk =
max( wrkbl, 3*m + bdspac )
566 minwrk = 3*m +
max( n, bdspac )
571 maxwrk =
max( maxwrk, minwrk )
572 work( 1 ) = droundup_lwork( maxwrk )
574 IF( lwork.LT.minwrk .AND. .NOT.lquery )
THEN
580 CALL xerbla(
'DGESDD', -info )
582 ELSE IF( lquery )
THEN
588 IF( m.EQ.0 .OR. n.EQ.0 )
THEN
595 smlnum = sqrt( dlamch(
'S' ) ) / eps
596 bignum = one / smlnum
600 anrm = dlange(
'M', m, n, a, lda, dum )
601 IF( disnan( anrm ) )
THEN
606 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN
608 CALL dlascl(
'G', 0, 0, anrm, smlnum, m, n, a, lda, ierr )
609 ELSE IF( anrm.GT.bignum )
THEN
611 CALL dlascl(
'G', 0, 0, anrm, bignum, m, n, a, lda, ierr )
620 IF( m.GE.mnthr )
THEN
634 CALL dgeqrf( m, n, a, lda, work( itau ), work( nwork ),
635 $ lwork - nwork + 1, ierr )
639 CALL dlaset(
'L', n-1, n-1, zero, zero, a( 2, 1 ), lda )
649 CALL dgebrd( n, n, a, lda, s, work( ie ), work( itauq ),
650 $ work( itaup ), work( nwork ), lwork-nwork+1,
657 CALL dbdsdc(
'U',
'N', n, s
658 $ dum, idum, work( nwork ), iwork, info )
660 ELSE IF( wntqo )
THEN
670 IF( lwork .GE. lda*n + n*n + 3*n + bdspac )
THEN
673 ldwrkr = ( lwork - n*n - 3*n - bdspac ) / n
682 CALL dgeqrf( m, n, a, lda, work( itau ), work( nwork ),
683 $ lwork - nwork + 1, ierr )
687 CALL dlacpy(
'U', n, n, a, lda, work( ir ), ldwrkr )
688 CALL dlaset(
'L', n - 1, n - 1, zero, zero, work(ir+1),
695 CALL dorgqr( m, n, n, a, lda, work( itau ),
696 $ work( nwork ), lwork - nwork + 1, ierr )
706 CALL dgebrd( n, n, work( ir ), ldwrkr, s, work( ie ),
707 $ work( itauq ), work( itaup ), work( nwork ),
708 $ lwork - nwork + 1, ierr )
720 CALL dbdsdc(
'U',
'I', n, s, work( ie ), work( iu ), n,
721 $ vt, ldvt, dum, idum, work( nwork ), iwork,
729 CALL dormbr(
'Q',
'L',
'N', n, n, n, work( ir ), ldwrkr,
731 $ lwork - nwork + 1, ierr )
732 CALL dormbr(
'P',
'R',
'T', n, n, n, work( ir ), ldwrkr,
733 $ work( itaup ), vt, ldvt, work( nwork ),
734 $ lwork - nwork + 1, ierr )
741 DO 10 i = 1, m, ldwrkr
742 chunk =
min( m - i + 1, ldwrkr )
743 CALL dgemm(
'N',
'N', chunk
744 $ lda, work( iu ), n, zero, work( ir ),
746 CALL dlacpy(
'F', chunk, n, work( ir ), ldwrkr,
750 ELSE IF( wntqs )
THEN
768 CALL dgeqrf( m, n, a, lda, work( itau ), work( nwork ),
769 $ lwork - nwork + 1, ierr )
773 CALL dlacpy(
'U', n, n, a, lda, work( ir ), ldwrkr )
774 CALL dlaset(
'L', n - 1, n - 1, zero, zero, work(ir+1),
781 CALL dorgqr( m, n, n, a, lda, work( itau ),
782 $ work( nwork ), lwork - nwork + 1, ierr )
792 CALL dgebrd( n, n, work( ir ), ldwrkr, s, work( ie ),
793 $ work( itauq ), work( itaup ), work( nwork ),
794 $ lwork - nwork + 1, ierr )
801 CALL dbdsdc(
'U',
'I', n, s, work( ie ), u, ldu, vt,
802 $ ldvt, dum, idum, work( nwork ), iwork,
810 CALL dormbr(
'Q', 'l
', 'n
', N, N, N, WORK( IR ), LDWRKR,
811 $ WORK( ITAUQ ), U, LDU, WORK( NWORK ),
812 $ LWORK - NWORK + 1, IERR )
814 CALL DORMBR( 'p
', 'r
', 't
', N, N, N, WORK( IR ), LDWRKR,
815 $ WORK( ITAUP ), VT, LDVT, WORK( NWORK ),
816 $ LWORK - NWORK + 1, IERR )
822 CALL DLACPY( 'f
', N, N, U, LDU, WORK( IR ), LDWRKR )
823 CALL DGEMM( 'n
', 'n
', M, N, N, ONE, A, LDA, WORK( IR ),
824 $ LDWRKR, ZERO, U, LDU )
826 ELSE IF( WNTQA ) THEN
844 CALL DGEQRF( M, N, A, LDA, WORK( ITAU ), WORK( NWORK ),
845 $ LWORK - NWORK + 1, IERR )
846 CALL DLACPY( 'l
', M, N, A, LDA, U, LDU )
851 CALL DORGQR( M, M, N, U, LDU, WORK( ITAU ),
852 $ WORK( NWORK ), LWORK - NWORK + 1, IERR )
856 CALL DLASET( 'l
', N-1, N-1, ZERO, ZERO, A( 2, 1 ), LDA )
866 CALL DGEBRD( N, N, A, LDA, S, WORK( IE ), WORK( ITAUQ ),
867 $ WORK( ITAUP ), WORK( NWORK ), LWORK-NWORK+1,
875 CALL DBDSDC( 'u
', 'i
', N, S, WORK( IE ), WORK( IU ), N,
876 $ VT, LDVT, DUM, IDUM, WORK( NWORK ), IWORK,
884 CALL DORMBR( 'q
', 'l
', 'n
', N, N, N, A, LDA,
885 $ WORK( ITAUQ ), WORK( IU ), LDWRKU,
886 $ WORK( NWORK ), LWORK - NWORK + 1, IERR )
887 CALL DORMBR( 'p
', 'r
', 't
', N, N, N, A, LDA,
888 $ WORK( ITAUP ), VT, LDVT, WORK( NWORK ),
889 $ LWORK - NWORK + 1, IERR )
895 CALL DGEMM( 'n
', 'n
', M, N, N, ONE, U, LDU, WORK( IU ),
896 $ LDWRKU, ZERO, A, LDA )
900 CALL DLACPY( 'f
', M, N, A, LDA, U, LDU )
920 CALL DGEBRD( M, N, A, LDA, S, WORK( IE ), WORK( ITAUQ ),
921 $ WORK( ITAUP ), WORK( NWORK ), LWORK-NWORK+1,
929 CALL DBDSDC( 'u
', 'n
', N, S, WORK( IE ), DUM, 1, DUM, 1,
930 $ DUM, IDUM, WORK( NWORK ), IWORK, INFO )
931 ELSE IF( WNTQO ) THEN
934.GE.
IF( LWORK M*N + 3*N + BDSPAC ) THEN
939 NWORK = IU + LDWRKU*N
940 CALL DLASET( 'f
', M, N, ZERO, ZERO, WORK( IU ),
949 NWORK = IU + LDWRKU*N
954 LDWRKR = ( LWORK - N*N - 3*N ) / N
956 NWORK = IU + LDWRKU*N
963 CALL DBDSDC( 'u
', 'i
', N, S, WORK( IE ), WORK( IU ),
964 $ LDWRKU, VT, LDVT, DUM, IDUM, WORK( NWORK ),
971 CALL DORMBR( 'p
', 'r
', 't
', N, N, N, A, LDA,
972 $ WORK( ITAUP ), VT, LDVT, WORK( NWORK ),
973 $ LWORK - NWORK + 1, IERR )
975.GE.
IF( LWORK M*N + 3*N + BDSPAC ) THEN
982 CALL DORMBR( 'q
', 'l',
'N', m, n, n, a, lda,
983 $ work( itauq ), work( iu ), ldwrku,
984 $ work( nwork ), lwork - nwork + 1, ierr )
988 CALL dlacpy(
'F', m, n, work( iu ), ldwrku, a, lda )
996 CALL dorgbr(
'Q', m, n, n, a, lda, work( itauq ),
997 $ work( nwork ), lwork - nwork + 1, ierr )
1005 DO 20 i = 1, m, ldwrkr
1006 chunk =
min( m - i + 1, ldwrkr )
1007 CALL dgemm(
'N',
'N', chunk, n, n, one, a( i, 1 ),
1008 $ lda, work( iu ), ldwrku, zero,
1009 $ work( ir ), ldwrkr )
1010 CALL dlacpy(
'F', chunk, n, work( ir ), ldwrkr,
1015 ELSE IF( wntqs )
THEN
1023 CALL dlaset(
'F', m, n, zero, zero, u, ldu )
1024 CALL dbdsdc(
'U',
'I', n, s, work( ie ), u, ldu, vt,
1025 $ ldvt, dum, idum, work( nwork ), iwork,
1033 CALL dormbr(
'Q',
'L',
'N', m, n, n, a, lda,
1034 $ work( itauq ), u, ldu, work( nwork ),
1035 $ lwork - nwork + 1, ierr )
1036 CALL dormbr(
'P',
'R',
'T', n, n, n, a, lda,
1037 $ work( itaup ), vt, ldvt, work( nwork ),
1038 $ lwork - nwork + 1, ierr )
1039 ELSE IF( wntqa )
THEN
1047 CALL dlaset(
'F', m, m, zero, zero, u, ldu )
1048 CALL dbdsdc(
'U',
'I', n, s, work( ie ), u, ldu, vt,
1049 $ ldvt, dum, idum, work( nwork ), iwork,
1055 CALL dlaset(
'F', m - n, m - n, zero, one, u(n+1,n+1),
1064 CALL dormbr(
'Q',
'L',
'N', m, m, n, a, lda,
1065 $ work( itauq ), u, ldu, work( nwork ),
1066 $ lwork - nwork + 1, ierr )
1067 CALL dormbr(
'P',
'R',
'T', n, n, m, a, lda,
1068 $ work( itaup ), vt, ldvt, work( nwork ),
1069 $ lwork - nwork + 1, ierr )
1080 IF( n.GE.mnthr )
THEN
1094 CALL dgelqf( m, n, a, lda, work( itau ), work( nwork ),
1095 $ lwork - nwork + 1, ierr )
1099 CALL dlaset(
'U', m-1, m-1, zero, zero, a( 1, 2 ), lda )
1109 CALL dgebrd( m, m, a, lda, s, work( ie ), work( itauq ),
1110 $ work( itaup ), work( nwork ), lwork-nwork+1,
1117 CALL dbdsdc(
'U',
'N', m, s, work( ie ), dum, 1, dum, 1,
1118 $ dum, idum, work( nwork ), iwork, info )
1120 ELSE IF( wntqo )
THEN
1132 IF( lwork .GE. m*n + m*m + 3*m + bdspac )
THEN
1137 chunk = ( lwork - m*m
1139 itau = il + ldwrkl*m
1146 CALL dgelqf( m, n, a, lda, work( itau ), work( nwork ),
1147 $ lwork - nwork + 1, ierr )
1151 CALL dlacpy(
'L', m, m, a, lda, work( il ), ldwrkl )
1152 CALL dlaset(
'U', m - 1, m - 1, zero, zero,
1153 $ work( il + ldwrkl ), ldwrkl )
1159 CALL dorglq( m, n, m, a, lda, work( itau ),
1160 $ work( nwork ), lwork - nwork + 1, ierr )
1170 CALL dgebrd( m, m, work( il ), ldwrkl, s, work( ie ),
1172 $ lwork - nwork + 1, ierr )
1179 CALL dbdsdc(
'U',
'I', m, s, work( ie ), u, ldu,
1180 $ work( ivt ), m, dum, idum, work( nwork ),
1188 CALL dormbr(
'Q', 'l
', 'n
', M, M, M, WORK( IL ), LDWRKL,
1189 $ WORK( ITAUQ ), U, LDU, WORK( NWORK ),
1190 $ LWORK - NWORK + 1, IERR )
1191 CALL DORMBR( 'p
', 'r
', 't
', M, M, M, WORK( IL ), LDWRKL,
1192 $ WORK( ITAUP ), WORK( IVT ), M,
1193 $ WORK( NWORK ), LWORK - NWORK + 1, IERR )
1201 DO 30 I = 1, N, CHUNK
1202 BLK = MIN( N - I + 1, CHUNK )
1203 CALL DGEMM( 'n
', 'n
', M, BLK, M, ONE, WORK( IVT ), M,
1204 $ A( 1, I ), LDA, ZERO, WORK( IL ), LDWRKL )
1205 CALL DLACPY( 'f
', M, BLK, WORK( IL ), LDWRKL,
1209 ELSE IF( WNTQS ) THEN
1220 ITAU = IL + LDWRKL*M
1227 CALL DGELQF( M, N, A, LDA, WORK( ITAU ), WORK( NWORK ),
1228 $ LWORK - NWORK + 1, IERR )
1232 CALL DLACPY( 'l
', M, M, A, LDA, WORK( IL ), LDWRKL )
1233 CALL DLASET( 'u
', M - 1, M - 1, ZERO, ZERO,
1234 $ WORK( IL + LDWRKL ), LDWRKL )
1240 CALL DORGLQ( M, N, M, A, LDA, WORK( ITAU ),
1241 $ WORK( NWORK ), LWORK - NWORK + 1, IERR )
1251 CALL DGEBRD( M, M, WORK( IL ), LDWRKL, S, WORK( IE ),
1252 $ WORK( ITAUQ ), WORK( ITAUP ), WORK( NWORK ),
1253 $ LWORK - NWORK + 1, IERR )
1260 CALL DBDSDC( 'u
', 'i
', M, S, WORK( IE ), U, LDU, VT,
1261 $ LDVT, DUM, IDUM, WORK( NWORK ), IWORK,
1269 CALL DORMBR( 'q
', 'l
', 'n
', M, M, M, WORK( IL ), LDWRKL,
1270 $ WORK( ITAUQ ), U, LDU, WORK( NWORK ),
1271 $ LWORK - NWORK + 1, IERR )
1272 CALL DORMBR( 'p
', 'r
', 't
', M, M, M, WORK( IL ), LDWRKL,
1273 $ WORK( ITAUP ), VT, LDVT, WORK( NWORK ),
1274 $ LWORK - NWORK + 1, IERR )
1280 CALL DLACPY( 'f
', M, M, VT, LDVT, WORK( IL ), LDWRKL )
1281 CALL DGEMM( 'n
', 'n
', M, N, M, ONE, WORK( IL ), LDWRKL,
1282 $ A, LDA, ZERO, VT, LDVT )
1284 ELSE IF( WNTQA ) THEN
1295 ITAU = IVT + LDWKVT*M
1302 CALL DGELQF( M, N, A, LDA, WORK( ITAU ), WORK( NWORK ),
1303 $ LWORK - NWORK + 1, IERR )
1304 CALL DLACPY( 'u
', M, N, A, LDA, VT, LDVT )
1310 CALL DORGLQ( N, N, M, VT, LDVT, WORK( ITAU ),
1311 $ WORK( NWORK ), LWORK - NWORK + 1, IERR )
1315 CALL DLASET( 'u
', M-1, M-1, ZERO, ZERO, A( 1, 2 ), LDA )
1325 CALL DGEBRD( M, M, A, LDA, S, WORK( IE ), WORK( ITAUQ ),
1326 $ WORK( ITAUP ), WORK( NWORK ), LWORK-NWORK+1,
1334 CALL DBDSDC( 'u
', 'i
', M, S, WORK( IE ), U, LDU,
1335 $ WORK( IVT ), LDWKVT, DUM, IDUM,
1336 $ WORK( NWORK ), IWORK, INFO )
1343 CALL DORMBR( 'q
', 'l
', 'n
', M, M, M, A, LDA,
1344 $ WORK( ITAUQ ), U, LDU, WORK( NWORK ),
1345 $ LWORK - NWORK + 1, IERR )
1346 CALL DORMBR( 'p
', 'r
', 't
', M, M, M, A, LDA,
1347 $ WORK( ITAUP ), WORK( IVT ), LDWKVT,
1348 $ WORK( NWORK ), LWORK - NWORK + 1, IERR )
1354 CALL DGEMM( 'n
', 'n
', M, N, M, ONE, WORK( IVT ), LDWKVT,
1355 $ VT, LDVT, ZERO, A, LDA )
1359 CALL DLACPY( 'f
', M, N, A, LDA, VT, LDVT )
1379 CALL DGEBRD( M, N, A, LDA, S, WORK( IE ), WORK( ITAUQ ),
1380 $ WORK( ITAUP ), WORK( NWORK ), LWORK-NWORK+1,
1388 CALL DBDSDC( 'l
', 'n
', M, S, WORK( IE ), DUM, 1, DUM, 1,
1389 $ DUM, IDUM, WORK( NWORK ), IWORK, INFO )
1390 ELSE IF( WNTQO ) THEN
1394.GE.
IF( LWORK M*N + 3*M + BDSPAC ) THEN
1398 CALL DLASET( 'f
', M, N, ZERO, ZERO, WORK( IVT ),
1400 NWORK = IVT + LDWKVT*N
1407 NWORK = IVT + LDWKVT*M
1412 CHUNK = ( LWORK - M*M - 3*M ) / M
1420 CALL DBDSDC( 'l
', 'i
', M, S, WORK( IE ), U, LDU,
1421 $ WORK( IVT ), LDWKVT, DUM, IDUM,
1422 $ WORK( NWORK ), IWORK, INFO )
1428 CALL DORMBR( 'q
', 'l
', 'n
', M, M, N, A, LDA,
1429 $ WORK( ITAUQ ), U, LDU, WORK( NWORK ),
1430 $ LWORK - NWORK + 1, IERR )
1432.GE.
IF( LWORK M*N + 3*M + BDSPAC ) THEN
1439 CALL DORMBR( 'p
', 'r
', 't
', M, N, M, A, LDA,
1440 $ WORK( ITAUP ), WORK( IVT ), LDWKVT,
1441 $ WORK( NWORK ), LWORK - NWORK + 1, IERR )
1445 CALL DLACPY( 'f
', M, N, WORK( IVT ), LDWKVT, A, LDA )
1453 CALL DORGBR( 'p
', M, N, M, A, LDA, WORK( ITAUP ),
1454 $ WORK( NWORK ), LWORK - NWORK + 1, IERR )
1462 DO 40 I = 1, N, CHUNK
1463 BLK = MIN( N - I + 1, CHUNK )
1464 CALL DGEMM( 'n
', 'n
', M, BLK, M, ONE, WORK( IVT ),
1465 $ LDWKVT, A( 1, I ), LDA, ZERO,
1467 CALL DLACPY( 'f
', M, BLK, WORK( IL ), M, A( 1, I ),
1471 ELSE IF( WNTQS ) THEN
1479 CALL DLASET( 'f
', M, N, ZERO, ZERO, VT, LDVT )
1480 CALL DBDSDC( 'l
', 'i
', M, S, WORK( IE ), U, LDU, VT,
1481 $ LDVT, DUM, IDUM, WORK( NWORK ), IWORK,
1489 CALL DORMBR( 'q
', 'l
', 'n
', M, M, N, A, LDA,
1490 $ WORK( ITAUQ ), U, LDU, WORK( NWORK ),
1491 $ LWORK - NWORK + 1, IERR )
1492 CALL DORMBR( 'p
', 'r
', 't
', M, N, M, A, LDA,
1493 $ WORK( ITAUP ), VT, LDVT, WORK( NWORK ),
1494 $ LWORK - NWORK + 1, IERR )
1495 ELSE IF( WNTQA ) THEN
1503 CALL DLASET( 'f
', N, N, ZERO, ZERO, VT, LDVT )
1504 CALL DBDSDC( 'l
', 'i
', M, S, WORK( IE ), U, LDU, VT,
1505 $ LDVT, DUM, IDUM, WORK( NWORK ), IWORK,
1511 CALL DLASET( 'f
', N-M, N-M, ZERO, ONE, VT(M+1,M+1),
1520 CALL DORMBR( 'q
', 'l
', 'n
', M, M, N, A, LDA,
1521 $ WORK( ITAUQ ), U, LDU, WORK( NWORK ),
1522 $ LWORK - NWORK + 1, IERR )
1523 CALL DORMBR( 'p
', 'r
', 't
', N, N, M, A, LDA,
1524 $ WORK( ITAUP ), VT, LDVT, WORK( NWORK ),
1525 $ LWORK - NWORK + 1, IERR )
1534.EQ.
IF( ISCL1 ) THEN
1535.GT.
IF( ANRMBIGNUM )
1536 $ CALL DLASCL( 'g
', 0, 0, BIGNUM, ANRM, MINMN, 1, S, MINMN,
1538.LT.
IF( ANRMSMLNUM )
1539 $ CALL DLASCL( 'g
', 0, 0, SMLNUM, ANRM, MINMN, 1, S, MINMN,
1545 WORK( 1 ) = DROUNDUP_LWORK( MAXWRK )