177 SUBROUTINE zlalsd( UPLO, SMLSIZ, N, NRHS, D, E, B, LDB, RCOND,
178 $ RANK, WORK, RWORK, IWORK, INFO )
186 INTEGER INFO, LDB, N, NRHS, RANK, SMLSIZ
187 DOUBLE PRECISION RCOND
191 DOUBLE PRECISION D( * ), E( * ), RWORK( * )
192 COMPLEX*16 B( LDB, * ), WORK( * )
198 DOUBLE PRECISION ZERO, ONE, TWO
199 parameter( zero = 0.0d0, one = 1.0d0, two = 2.0d0 )
201 parameter( czero = ( 0.0d0, 0.0d0 ) )
204 INTEGER BX, BXST, C, DIFL, DIFR, GIVCOL, GIVNUM,
205 $ givptr, i, icmpq1, icmpq2, irwb, irwib, irwrb,
206 $ irwu, irwvt, irwwrk, iwk, j, jcol, jimag,
207 $ jreal, jrow, k, nlvl, nm1, nrwork, nsize, nsub,
208 $ perm, poles, s, sizei, smlszp, sqre, st, st1,
210 DOUBLE PRECISION CS, EPS, ORGNRM, RCND, R, SN, TOL
214 DOUBLE PRECISION DLAMCH, DLANST
215 EXTERNAL idamax, dlamch, dlanst
224 INTRINSIC abs, dble, dcmplx, dimag, int, log, sign
234 ELSE IF( nrhs.LT.1 )
THEN
236 ELSE IF( ( ldb.LT.1 ) .OR. ( ldb.LT.n ) )
THEN
240 CALL xerbla(
'ZLALSD', -info )
244 eps = dlamch(
'Epsilon' )
248 IF( ( rcond.LE.zero ) .OR. ( rcond.GE.one ) )
THEN
260 ELSE IF( n.EQ.1 )
THEN
261 IF( d( 1 ).EQ.zero )
THEN
262 CALL zlaset(
'A', 1, nrhs, czero, czero, b, ldb )
265 CALL zlascl(
'G', 0, 0, d( 1 ), one, 1, nrhs, b, ldb,
267 d( 1 ) = abs( d( 1 ) )
274 IF( uplo.EQ.
'L' )
THEN
276 CALL dlartg( d( i ), e( i ), cs, sn, r )
279 d( i+1 ) = cs*d( i+1 )
281 CALL zdrot( 1, b( i, 1 ), 1, b( i+1, 1 ), 1, cs, sn )
292 CALL zdrot( 1, b( j, i ), 1, b( j+1, i ), 1, cs,
302 orgnrm = dlanst(
'M', n, d, e )
303 IF( orgnrm.EQ.zero )
THEN
304 CALL zlaset(
'A', n, nrhs, czero, czero, b, ldb )
308 CALL dlascl(
'G', 0, 0, orgnrm, one, n, 1, d, n, info )
309 CALL dlascl(
'G', 0, 0, orgnrm, one, nm1, 1, e, nm1, info )
314 IF( n.LE.smlsiz )
THEN
319 irwib = irwrb + n*nrhs
320 irwb = irwib + n*nrhs
321 CALL dlaset(
'A', n, n, zero, one, rwork( irwu ), n )
322 CALL dlaset(
'A', n, n, zero, one, rwork( irwvt ), n )
323 CALL dlasdq(
'U', 0, n, n, n, 0, d, e, rwork( irwvt ), n,
324 $ rwork( irwu ), n, rwork( irwwrk ), 1,
325 $ rwork( irwwrk ), info )
338 rwork( j ) = dble( b( jrow, jcol ) )
341 CALL dgemm(
'T',
'N', n, nrhs, n, one, rwork( irwu ), n,
342 $ rwork( irwb ), n, zero, rwork( irwrb ), n )
347 rwork( j ) = dimag( b( jrow, jcol ) )
350 CALL dgemm(
'T',
'N', n, nrhs, n, one, rwork( irwu ), n,
351 $ rwork( irwb ), n, zero, rwork( irwib ), n )
358 b( jrow, jcol ) = dcmplx( rwork( jreal ),
363 tol = rcnd*abs( d( idamax( n, d, 1 ) ) )
365 IF( d( i ).LE.tol )
THEN
366 CALL zlaset(
'A', 1, nrhs, czero, czero, b( i, 1 ),
369 CALL zlascl(
'G', 0, 0, d( i ), one, 1, nrhs, b( i,
384 DO 120 jcol = 1, nrhs
387 rwork( j ) = dble( b( jrow, jcol ) )
390 CALL dgemm(
'T',
'N', n, nrhs, n, one, rwork( irwvt ), n,
391 $ rwork( irwb ), n, zero, rwork( irwrb ), n )
393 DO 140 jcol = 1, nrhs
396 rwork( j ) = dimag( b( jrow, jcol ) )
399 CALL dgemm(
'T',
'N', n, nrhs, n, one, rwork( irwvt ), n,
400 $ rwork( irwb ), n, zero, rwork( irwib ), n )
403 DO 160 jcol = 1, nrhs
407 b( jrow, jcol ) = dcmplx( rwork( jreal ),
414 CALL dlascl(
'G', 0, 0, one, orgnrm, n, 1, d, n, info )
415 CALL dlasrt(
'D', n, d, info )
416 CALL zlascl(
'G', 0, 0, orgnrm, one, n, nrhs, b, ldb, info )
423 nlvl = int( log( dble( n ) / dble( smlsiz+1 ) ) / log( two ) ) + 1
435 givnum = poles + 2*nlvl*n
436 nrwork = givnum + 2*nlvl*n
440 irwib = irwrb + smlsiz*nrhs
441 irwb = irwib + smlsiz*nrhs
447 givcol = perm + nlvl*n
448 iwk = givcol + nlvl*n*2
457 IF( abs( d( i ) ).LT.eps )
THEN
458 d( i ) = sign( eps, d( i ) )
463 IF( ( abs( e( i ) ).LT.eps ) .OR. ( i.EQ.nm1 ) )
THEN
475 iwork( sizei+nsub-1 ) = nsize
476 ELSE IF( abs( e( i ) ).GE.eps )
THEN
481 iwork( sizei+nsub-1 ) = nsize
489 iwork( sizei+nsub-1 ) = nsize
492 iwork( sizei+nsub-1 ) = 1
493 CALL zcopy( nrhs, b( n, 1 ), ldb, work( bx+nm1 ), n )
496 IF( nsize.EQ.1 )
THEN
501 CALL zcopy( nrhs, b( st, 1 ), ldb, work( bx+st1 ), n )
502 ELSE IF( nsize.LE.smlsiz )
THEN
506 CALL dlaset(
'A', nsize, nsize, zero, one,
507 $ rwork( vt+st1 ), n )
508 CALL dlaset(
'A', nsize, nsize, zero, one,
509 $ rwork( u+st1 ), n )
510 CALL dlasdq(
'U', 0, nsize, nsize, nsize, 0, d( st ),
511 $ e( st ), rwork( vt+st1 ), n, rwork( u+st1 ),
512 $ n, rwork( nrwork ), 1, rwork( nrwork ),
523 DO 190 jcol = 1, nrhs
524 DO 180 jrow = st, st + nsize - 1
526 rwork( j ) = dble( b( jrow, jcol ) )
529 CALL dgemm(
'T',
'N', nsize, nrhs, nsize, one,
530 $ rwork( u+st1 ), n, rwork( irwb ), nsize,
531 $ zero, rwork( irwrb ), nsize )
533 DO 210 jcol = 1, nrhs
534 DO 200 jrow = st, st + nsize - 1
536 rwork( j ) = dimag( b( jrow, jcol ) )
539 CALL dgemm(
'T',
'N', nsize, nrhs, nsize, one,
540 $ rwork( u+st1 ), n, rwork( irwb ), nsize,
541 $ zero, rwork( irwib ), nsize )
544 DO 230 jcol = 1, nrhs
545 DO 220 jrow = st, st + nsize - 1
548 b( jrow, jcol ) = dcmplx( rwork( jreal ),
553 CALL zlacpy(
'A', nsize, nrhs, b( st, 1 ), ldb,
554 $ work( bx+st1 ), n )
559 CALL dlasda( icmpq1, smlsiz, nsize, sqre, d( st ),
560 $ e( st ), rwork( u+st1 ), n, rwork( vt+st1 ),
561 $ iwork( k+st1 ), rwork( difl+st1 ),
562 $ rwork( difr+st1 ), rwork( z+st1 ),
563 $ rwork( poles+st1 ), iwork( givptr+st1 ),
564 $ iwork( givcol+st1 ), n, iwork( perm+st1 ),
565 $ rwork( givnum+st1 ), rwork( c+st1 ),
566 $ rwork( s+st1 ), rwork( nrwork ),
567 $ iwork( iwk ), info )
572 CALL zlalsa( icmpq2, smlsiz, nsize, nrhs, b( st, 1 ),
573 $ ldb, work( bxst ), n, rwork( u+st1 ), n,
574 $ rwork( vt+st1 ), iwork( k+st1 ),
575 $ rwork( difl+st1 ), rwork( difr+st1 ),
576 $ rwork( z+st1 ), rwork( poles+st1 ),
577 $ iwork( givptr+st1 ), iwork( givcol+st1 ), n,
578 $ iwork( perm+st1 ), rwork( givnum+st1 ),
579 $ rwork( c+st1 ), rwork( s+st1 ),
580 $ rwork( nrwork ), iwork( iwk ), info )
591 tol = rcnd*abs( d( idamax( n, d, 1 ) ) )
598 IF( abs( d( i ) ).LE.tol )
THEN
599 CALL zlaset(
'A', 1, nrhs, czero, czero, work( bx+i-1 ),
603 CALL zlascl(
'G', 0, 0, d( i ), one, 1, nrhs,
604 $ work( bx+i-1 ), n, info )
606 d( i ) = abs( d( i ) )
615 nsize = iwork( sizei+i-1 )
617 IF( nsize.EQ.1 )
THEN
618 CALL zcopy( nrhs, work( bxst ), n, b( st, 1 ), ldb )
619 ELSE IF( nsize.LE.smlsiz )
THEN
630 DO 270 jcol = 1, nrhs
632 DO 260 jrow = 1, nsize
634 rwork( jreal ) = dble( work( j+jrow ) )
637 CALL dgemm(
'T',
'N', nsize, nrhs, nsize, one,
638 $ rwork( vt+st1 ), n, rwork( irwb ), nsize, zero,
639 $ rwork( irwrb ), nsize )
642 DO 290 jcol = 1, nrhs
644 DO 280 jrow = 1, nsize
646 rwork( jimag ) = dimag( work( j+jrow ) )
649 CALL dgemm(
'T',
'N', nsize, nrhs, nsize, one,
650 $ rwork( vt+st1 ), n, rwork( irwb ), nsize, zero,
651 $ rwork( irwib ), nsize )
654 DO 310 jcol = 1, nrhs
655 DO 300 jrow = st, st + nsize - 1
658 b( jrow, jcol ) = dcmplx( rwork( jreal ),
663 CALL zlalsa( icmpq2, smlsiz, nsize, nrhs, work( bxst ),
665 $ b( st, 1 ), ldb, rwork( u+st1 ), n,
666 $ rwork( vt+st1 ), iwork( k+st1 ),
667 $ rwork( difl+st1 ), rwork( difr+st1 ),
668 $ rwork( z+st1 ), rwork( poles+st1 ),
669 $ iwork( givptr+st1 ), iwork( givcol+st1 ), n,
670 $ iwork( perm+st1 ), rwork( givnum+st1 ),
671 $ rwork( c+st1 ), rwork( s+st1 ),
672 $ rwork( nrwork ), iwork( iwk ), info )
681 CALL dlascl(
'G', 0, 0, one, orgnrm, n, 1, d, n, info )
682 CALL dlasrt(
'D', n, d, info )
683 CALL zlascl(
'G', 0, 0, orgnrm, one, n, nrhs, b, ldb, info )