197 INTEGER info, ldb, n, nrhs, rank, smlsiz
198 DOUBLE PRECISION rcond
202 DOUBLE PRECISION d( * ), e( * ), rwork( * )
203 COMPLEX*16 b( ldb, * ), work( * )
209 DOUBLE PRECISION zero, one, two
210 parameter( zero = 0.0d0, one = 1.0d0, two = 2.0d0 )
212 parameter( czero = ( 0.0d0, 0.0d0 ) )
215 INTEGER bx, bxst, c, difl, difr, givcol, givnum,
216 $ givptr, i, icmpq1, icmpq2, irwb, irwib, irwrb,
217 $ irwu, irwvt, irwwrk, iwk, j, jcol, jimag,
218 $ jreal, jrow, k, nlvl, nm1, nrwork, nsize, nsub,
219 $ perm, poles, s, sizei, smlszp, sqre, st, st1,
221 DOUBLE PRECISION cs, eps, orgnrm, rcnd, r, sn, tol
234 INTRINSIC abs, dble, dcmplx, dimag, int, log, sign
244 ELSE IF( nrhs.LT.1 )
THEN 246 ELSE IF( ( ldb.LT.1 ) .OR. ( ldb.LT.n ) )
THEN 250 CALL xerbla(
'ZLALSD', -info )
258 IF( ( rcond.LE.zero ) .OR. ( rcond.GE.one ) )
THEN 270 ELSE IF( n.EQ.1 )
THEN 271 IF( d( 1 ).EQ.zero )
THEN 272 CALL zlaset(
'A', 1, nrhs, czero, czero, b, ldb )
275 CALL zlascl(
'G', 0, 0, d( 1 ), one, 1, nrhs, b, ldb, info )
276 d( 1 ) = abs( d( 1 ) )
283 IF( uplo.EQ.
'L' )
THEN 285 CALL dlartg( d( i ), e( i ), cs, sn, r )
288 d( i+1 ) = cs*d( i+1 )
290 CALL zdrot( 1, b( i, 1 ), 1, b( i+1, 1 ), 1, cs, sn )
301 CALL zdrot( 1, b( j, i ), 1, b( j+1, i ), 1, cs, sn )
310 orgnrm =
dlanst(
'M', n, d, e )
311 IF( orgnrm.EQ.zero )
THEN 312 CALL zlaset(
'A', n, nrhs, czero, czero, b, ldb )
316 CALL dlascl(
'G', 0, 0, orgnrm, one, n, 1, d, n, info )
317 CALL dlascl(
'G', 0, 0, orgnrm, one, nm1, 1, e, nm1, info )
322 IF( n.LE.smlsiz )
THEN 327 irwib = irwrb + n*nrhs
328 irwb = irwib + n*nrhs
329 CALL dlaset(
'A', n, n, zero, one, rwork( irwu ), n )
330 CALL dlaset(
'A', n, n, zero, one, rwork( irwvt ), n )
331 CALL dlasdq(
'U', 0, n, n, n, 0, d, e, rwork( irwvt ), n,
332 $ rwork( irwu ), n, rwork( irwwrk ), 1,
333 $ rwork( irwwrk ), info )
346 rwork( j ) = dble( b( jrow, jcol ) )
349 CALL dgemm(
'T',
'N', n, nrhs, n, one, rwork( irwu ), n,
350 $ rwork( irwb ), n, zero, rwork( irwrb ), n )
355 rwork( j ) = dimag( b( jrow, jcol ) )
358 CALL dgemm(
'T',
'N', n, nrhs, n, one, rwork( irwu ), n,
359 $ rwork( irwb ), n, zero, rwork( irwib ), n )
366 b( jrow, jcol ) = dcmplx( rwork( jreal ),
371 tol = rcnd*abs( d(
idamax( n, d, 1 ) ) )
373 IF( d( i ).LE.tol )
THEN 374 CALL zlaset(
'A', 1, nrhs, czero, czero, b( i, 1 ), ldb )
376 CALL zlascl(
'G', 0, 0, d( i ), one, 1, nrhs, b( i, 1 ),
390 DO 120 jcol = 1, nrhs
393 rwork( j ) = dble( b( jrow, jcol ) )
396 CALL dgemm(
'T',
'N', n, nrhs, n, one, rwork( irwvt ), n,
397 $ rwork( irwb ), n, zero, rwork( irwrb ), n )
399 DO 140 jcol = 1, nrhs
402 rwork( j ) = dimag( b( jrow, jcol ) )
405 CALL dgemm(
'T',
'N', n, nrhs, n, one, rwork( irwvt ), n,
406 $ rwork( irwb ), n, zero, rwork( irwib ), n )
409 DO 160 jcol = 1, nrhs
413 b( jrow, jcol ) = dcmplx( rwork( jreal ),
420 CALL dlascl(
'G', 0, 0, one, orgnrm, n, 1, d, n, info )
421 CALL dlasrt(
'D', n, d, info )
422 CALL zlascl(
'G', 0, 0, orgnrm, one, n, nrhs, b, ldb, info )
429 nlvl = int( log( dble( n ) / dble( smlsiz+1 ) ) / log( two ) ) + 1
441 givnum = poles + 2*nlvl*n
442 nrwork = givnum + 2*nlvl*n
446 irwib = irwrb + smlsiz*nrhs
447 irwb = irwib + smlsiz*nrhs
453 givcol = perm + nlvl*n
454 iwk = givcol + nlvl*n*2
463 IF( abs( d( i ) ).LT.eps )
THEN 464 d( i ) = sign( eps, d( i ) )
469 IF( ( abs( e( i ) ).LT.eps ) .OR. ( i.EQ.nm1 ) )
THEN 481 iwork( sizei+nsub-1 ) = nsize
482 ELSE IF( abs( e( i ) ).GE.eps )
THEN 487 iwork( sizei+nsub-1 ) = nsize
495 iwork( sizei+nsub-1 ) = nsize
498 iwork( sizei+nsub-1 ) = 1
499 CALL zcopy( nrhs, b( n, 1 ), ldb, work( bx+nm1 ), n )
502 IF( nsize.EQ.1 )
THEN 507 CALL zcopy( nrhs, b( st, 1 ), ldb, work( bx+st1 ), n )
508 ELSE IF( nsize.LE.smlsiz )
THEN 512 CALL dlaset(
'A', nsize, nsize, zero, one,
513 $ rwork( vt+st1 ), n )
514 CALL dlaset(
'A', nsize, nsize, zero, one,
515 $ rwork( u+st1 ), n )
516 CALL dlasdq(
'U', 0, nsize, nsize, nsize, 0, d( st ),
517 $ e( st ), rwork( vt+st1 ), n, rwork( u+st1 ),
518 $ n, rwork( nrwork ), 1, rwork( nrwork ),
529 DO 190 jcol = 1, nrhs
530 DO 180 jrow = st, st + nsize - 1
532 rwork( j ) = dble( b( jrow, jcol ) )
535 CALL dgemm(
'T',
'N', nsize, nrhs, nsize, one,
536 $ rwork( u+st1 ), n, rwork( irwb ), nsize,
537 $ zero, rwork( irwrb ), nsize )
539 DO 210 jcol = 1, nrhs
540 DO 200 jrow = st, st + nsize - 1
542 rwork( j ) = dimag( b( jrow, jcol ) )
545 CALL dgemm(
'T',
'N', nsize, nrhs, nsize, one,
546 $ rwork( u+st1 ), n, rwork( irwb ), nsize,
547 $ zero, rwork( irwib ), nsize )
550 DO 230 jcol = 1, nrhs
551 DO 220 jrow = st, st + nsize - 1
554 b( jrow, jcol ) = dcmplx( rwork( jreal ),
559 CALL zlacpy(
'A', nsize, nrhs, b( st, 1 ), ldb,
560 $ work( bx+st1 ), n )
565 CALL dlasda( icmpq1, smlsiz, nsize, sqre, d( st ),
566 $ e( st ), rwork( u+st1 ), n, rwork( vt+st1 ),
567 $ iwork( k+st1 ), rwork( difl+st1 ),
568 $ rwork( difr+st1 ), rwork( z+st1 ),
569 $ rwork( poles+st1 ), iwork( givptr+st1 ),
570 $ iwork( givcol+st1 ), n, iwork( perm+st1 ),
571 $ rwork( givnum+st1 ), rwork( c+st1 ),
572 $ rwork( s+st1 ), rwork( nrwork ),
573 $ iwork( iwk ), info )
578 CALL zlalsa( icmpq2, smlsiz, nsize, nrhs, b( st, 1 ),
579 $ ldb, work( bxst ), n, rwork( u+st1 ), n,
580 $ rwork( vt+st1 ), iwork( k+st1 ),
581 $ rwork( difl+st1 ), rwork( difr+st1 ),
582 $ rwork( z+st1 ), rwork( poles+st1 ),
583 $ iwork( givptr+st1 ), iwork( givcol+st1 ), n,
584 $ iwork( perm+st1 ), rwork( givnum+st1 ),
585 $ rwork( c+st1 ), rwork( s+st1 ),
586 $ rwork( nrwork ), iwork( iwk ), info )
597 tol = rcnd*abs( d(
idamax( n, d, 1 ) ) )
604 IF( abs( d( i ) ).LE.tol )
THEN 605 CALL zlaset(
'A', 1, nrhs, czero, czero, work( bx+i-1 ), n )
608 CALL zlascl(
'G', 0, 0, d( i ), one, 1, nrhs,
609 $ work( bx+i-1 ), n, info )
611 d( i ) = abs( d( i ) )
620 nsize = iwork( sizei+i-1 )
622 IF( nsize.EQ.1 )
THEN 623 CALL zcopy( nrhs, work( bxst ), n, b( st, 1 ), ldb )
624 ELSE IF( nsize.LE.smlsiz )
THEN 635 DO 270 jcol = 1, nrhs
637 DO 260 jrow = 1, nsize
639 rwork( jreal ) = dble( work( j+jrow ) )
642 CALL dgemm(
'T',
'N', nsize, nrhs, nsize, one,
643 $ rwork( vt+st1 ), n, rwork( irwb ), nsize, zero,
644 $ rwork( irwrb ), nsize )
647 DO 290 jcol = 1, nrhs
649 DO 280 jrow = 1, nsize
651 rwork( jimag ) = dimag( work( j+jrow ) )
654 CALL dgemm(
'T',
'N', nsize, nrhs, nsize, one,
655 $ rwork( vt+st1 ), n, rwork( irwb ), nsize, zero,
656 $ rwork( irwib ), nsize )
659 DO 310 jcol = 1, nrhs
660 DO 300 jrow = st, st + nsize - 1
663 b( jrow, jcol ) = dcmplx( rwork( jreal ),
668 CALL zlalsa( icmpq2, smlsiz, nsize, nrhs, work( bxst ), n,
669 $ b( st, 1 ), ldb, rwork( u+st1 ), n,
670 $ rwork( vt+st1 ), iwork( k+st1 ),
671 $ rwork( difl+st1 ), rwork( difr+st1 ),
672 $ rwork( z+st1 ), rwork( poles+st1 ),
673 $ iwork( givptr+st1 ), iwork( givcol+st1 ), n,
674 $ iwork( perm+st1 ), rwork( givnum+st1 ),
675 $ rwork( c+st1 ), rwork( s+st1 ),
676 $ rwork( nrwork ), iwork( iwk ), info )
685 CALL dlascl(
'G', 0, 0, one, orgnrm, n, 1, d, n, info )
686 CALL dlasrt(
'D', n, d, info )
687 CALL zlascl(
'G', 0, 0, orgnrm, one, n, nrhs, b, ldb, info )
double precision function dlamch(CMACH)
DLAMCH
subroutine dlasda(ICOMPQ, SMLSIZ, N, SQRE, D, E, U, LDU, VT, K, DIFL, DIFR, Z, POLES, GIVPTR, GIVCOL, LDGCOL, PERM, GIVNUM, C, S, WORK, IWORK, INFO)
DLASDA computes the singular value decomposition (SVD) of a real upper bidiagonal matrix with diagona...
integer function idamax(N, DX, INCX)
IDAMAX
subroutine zcopy(N, ZX, INCX, ZY, INCY)
ZCOPY
subroutine dlascl(TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO)
DLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine zlascl(TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO)
ZLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine zlacpy(UPLO, M, N, A, LDA, B, LDB)
ZLACPY copies all or part of one two-dimensional array to another.
subroutine dlartg(F, G, CS, SN, R)
DLARTG generates a plane rotation with real cosine and real sine.
subroutine dlaset(UPLO, M, N, ALPHA, BETA, A, LDA)
DLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values...
subroutine dgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
DGEMM
subroutine dlasdq(UPLO, SQRE, N, NCVT, NRU, NCC, D, E, VT, LDVT, U, LDU, C, LDC, WORK, INFO)
DLASDQ computes the SVD of a real bidiagonal matrix with diagonal d and off-diagonal e...
subroutine zdrot(N, CX, INCX, CY, INCY, C, S)
ZDROT
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine zlaset(UPLO, M, N, ALPHA, BETA, A, LDA)
ZLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values...
subroutine dlasrt(ID, N, D, INFO)
DLASRT sorts numbers in increasing or decreasing order.
double precision function dlanst(NORM, N, D, E)
DLANST returns the value of the 1-norm, or the Frobenius norm, or the infinity norm, or the element of largest absolute value of a real symmetric tridiagonal matrix.
subroutine zlalsa(ICOMPQ, SMLSIZ, N, NRHS, B, LDB, BX, LDBX, U, LDU, VT, K, DIFL, DIFR, Z, POLES, GIVPTR, GIVCOL, LDGCOL, PERM, GIVNUM, C, S, RWORK, IWORK, INFO)
ZLALSA computes the SVD of the coefficient matrix in compact form. Used by sgelsd.