187 SUBROUTINE zlalsd( UPLO, SMLSIZ, N, NRHS, D, E, B, LDB, RCOND,
188 $ RANK, WORK, RWORK, IWORK, INFO )
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
225 DOUBLE PRECISION DLAMCH, DLANST
226 EXTERNAL idamax, dlamch, dlanst
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 )
254 eps = dlamch(
'Epsilon' )
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 )