177 SUBROUTINE slalsd( UPLO, SMLSIZ, N, NRHS, D, E, B, LDB, RCOND,
178 $ RANK, WORK, IWORK, INFO )
186 INTEGER INFO, LDB, N, NRHS, RANK, SMLSIZ
191 REAL B( LDB, * ), D( * ), E( * ), WORK( * )
198 parameter( zero = 0.0e0, one = 1.0e0, two = 2.0e0 )
201 INTEGER BX, BXST, C, DIFL, DIFR, GIVCOL, GIVNUM,
202 $ givptr, i, icmpq1, icmpq2, iwk, j, k, nlvl,
203 $ nm1, nsize, nsub, nwork, perm, poles, s, sizei,
204 $ smlszp, sqre, st, st1, u, vt, z
205 REAL CS, EPS, ORGNRM, R, RCND, SN, TOL
210 EXTERNAL isamax, slamch, slanst
217 INTRINSIC abs, int, log, real, sign
227 ELSE IF( nrhs.LT.1 )
THEN
229 ELSE IF( ( ldb.LT.1 ) .OR. ( ldb.LT.n ) )
THEN
233 CALL xerbla(
'SLALSD', -info )
237 eps = slamch(
'Epsilon' )
241 IF( ( rcond.LE.zero ) .OR. ( rcond.GE.one ) )
THEN
253 ELSE IF( n.EQ.1 )
THEN
254 IF( d( 1 ).EQ.zero )
THEN
255 CALL slaset(
'A', 1, nrhs, zero, zero, b, ldb )
258 CALL slascl(
'G', 0, 0, d( 1 ), one, 1, nrhs, b, ldb, info )
259 d( 1 ) = abs( d( 1 ) )
266 IF( uplo.EQ.
'L' )
THEN
268 CALL slartg( d( i ), e( i ), cs, sn, r )
271 d( i+1 ) = cs*d( i+1 )
273 CALL srot( 1, b( i, 1 ), 1, b( i+1, 1 ), 1, cs, sn )
284 CALL srot( 1, b( j, i ), 1, b( j+1, i ), 1, cs, sn )
293 orgnrm = slanst(
'M', n, d, e )
294 IF( orgnrm.EQ.zero )
THEN
299 CALL slascl(
'G', 0, 0, orgnrm, one, n, 1, d, n, info )
300 CALL slascl( 'g
', 0, 0, ORGNRM, ONE, NM1, 1, E, NM1, INFO )
305.LE.
IF( NSMLSIZ ) THEN
307 CALL SLASET( 'a
', N, N, ZERO, ONE, WORK, N )
308 CALL SLASDQ( 'u
', 0, N, N, 0, NRHS, D, E, WORK, N, WORK, N, B,
309 $ LDB, WORK( NWORK ), INFO )
313 TOL = RCND*ABS( D( ISAMAX( N, D, 1 ) ) )
315.LE.
IF( D( I )TOL ) THEN
316 CALL SLASET( 'a
', 1, NRHS, ZERO, ZERO, B( I, 1 ), LDB )
318 CALL SLASCL( 'g
', 0, 0, D( I ), ONE, 1, NRHS, B( I, 1 ),
323 CALL SGEMM( 't
', 'n
', N, NRHS, N, ONE, WORK, N, B, LDB, ZERO,
325 CALL SLACPY( 'a
', N, NRHS, WORK( NWORK ), N, B, LDB )
329 CALL SLASCL( 'g
', 0, 0, ONE, ORGNRM, N, 1, D, N, INFO )
330 CALL SLASRT( 'd
', N, D, INFO )
331 CALL SLASCL( 'g
', 0, 0, ORGNRM, ONE, N, NRHS, B, LDB, INFO )
338 NLVL = INT( LOG( REAL( N ) / REAL( SMLSIZ+1 ) ) / LOG( TWO ) ) + 1
350 GIVNUM = POLES + 2*NLVL*N
351 BX = GIVNUM + 2*NLVL*N
358 GIVCOL = PERM + NLVL*N
359 IWK = GIVCOL + NLVL*N*2
368.LT.
IF( ABS( D( I ) )EPS ) THEN
369 D( I ) = SIGN( EPS, D( I ) )
374.LT..OR..EQ.
IF( ( ABS( E( I ) )EPS ) ( INM1 ) ) THEN
386 IWORK( SIZEI+NSUB-1 ) = NSIZE
387.GE.
ELSE IF( ABS( E( I ) )EPS ) THEN
392 IWORK( SIZEI+NSUB-1 ) = NSIZE
400 IWORK( SIZEI+NSUB-1 ) = NSIZE
403 IWORK( SIZEI+NSUB-1 ) = 1
404 CALL SCOPY( NRHS, B( N, 1 ), LDB, WORK( BX+NM1 ), N )
407.EQ.
IF( NSIZE1 ) THEN
412 CALL SCOPY( NRHS, B( ST, 1 ), LDB, WORK( BX+ST1 ), N )
413.LE.
ELSE IF( NSIZESMLSIZ ) THEN
417 CALL SLASET( 'a
', NSIZE, NSIZE, ZERO, ONE,
418 $ WORK( VT+ST1 ), N )
419 CALL SLASDQ( 'u
', 0, NSIZE, NSIZE, 0, NRHS, D( ST ),
420 $ E( ST ), WORK( VT+ST1 ), N, WORK( NWORK ),
421 $ N, B( ST, 1 ), LDB, WORK( NWORK ), INFO )
425 CALL SLACPY( 'a
', NSIZE, NRHS, B( ST, 1 ), LDB,
426 $ WORK( BX+ST1 ), N )
431 CALL SLASDA( ICMPQ1, SMLSIZ, NSIZE, SQRE, D( ST ),
432 $ E( ST ), WORK( U+ST1 ), N, WORK( VT+ST1 ),
433 $ IWORK( K+ST1 ), WORK( DIFL+ST1 ),
434 $ WORK( DIFR+ST1 ), WORK( Z+ST1 ),
435 $ WORK( POLES+ST1 ), IWORK( GIVPTR+ST1 ),
436 $ IWORK( GIVCOL+ST1 ), N, IWORK( PERM+ST1 ),
437 $ WORK( GIVNUM+ST1 ), WORK( C+ST1 ),
438 $ WORK( S+ST1 ), WORK( NWORK ), IWORK( IWK ),
444 CALL SLALSA( ICMPQ2, SMLSIZ, NSIZE, NRHS, B( ST, 1 ),
445 $ LDB, WORK( BXST ), N, WORK( U+ST1 ), N,
446 $ WORK( VT+ST1 ), IWORK( K+ST1 ),
447 $ WORK( DIFL+ST1 ), WORK( DIFR+ST1 ),
448 $ WORK( Z+ST1 ), WORK( POLES+ST1 ),
449 $ IWORK( GIVPTR+ST1 ), IWORK( GIVCOL+ST1 ), N,
450 $ IWORK( PERM+ST1 ), WORK( GIVNUM+ST1 ),
451 $ WORK( C+ST1 ), WORK( S+ST1 ), WORK( NWORK ),
452 $ IWORK( IWK ), INFO )
463 TOL = RCND*ABS( D( ISAMAX( N, D, 1 ) ) )
470.LE.
IF( ABS( D( I ) )TOL ) THEN
471 CALL SLASET( 'a
', 1, NRHS, ZERO, ZERO, WORK( BX+I-1 ), N )
474 CALL SLASCL( 'g
', 0, 0, D( I ), ONE, 1, NRHS,
475 $ WORK( BX+I-1 ), N, INFO )
477 D( I ) = ABS( D( I ) )
486 NSIZE = IWORK( SIZEI+I-1 )
488.EQ.
IF( NSIZE1 ) THEN
489 CALL SCOPY( NRHS, WORK( BXST ), N, B( ST, 1 ), LDB )
490.LE.
ELSE IF( NSIZESMLSIZ ) THEN
491 CALL SGEMM( 't
', 'n
', NSIZE, NRHS, NSIZE, ONE,
492 $ WORK( VT+ST1 ), N, WORK( BXST ), N, ZERO,
495 CALL SLALSA( ICMPQ2, SMLSIZ, NSIZE, NRHS, WORK( BXST ), N,
496 $ B( ST, 1 ), LDB, WORK( U+ST1 ), N,
497 $ WORK( VT+ST1 ), IWORK( K+ST1 ),
498 $ WORK( DIFL+ST1 ), WORK( DIFR+ST1 ),
499 $ WORK( Z+ST1 ), WORK( POLES+ST1 ),
500 $ IWORK( GIVPTR+ST1 ), IWORK( GIVCOL+ST1 ), N,
501 $ IWORK( PERM+ST1 ), WORK( GIVNUM+ST1 ),
502 $ WORK( C+ST1 ), WORK( S+ST1 ), WORK( NWORK ),
503 $ IWORK( IWK ), INFO )
512 CALL SLASCL( 'g
', 0, 0, ONE, ORGNRM, N, 1, D, N, INFO )
513 CALL SLASRT( 'd
', N, D, INFO )
514 CALL SLASCL( 'g
', 0, 0, ORGNRM, ONE, N, NRHS, B, LDB, INFO )
subroutine slasda(icompq, smlsiz, n, sqre, d, e, u, ldu, vt, k, difl, difr, z, poles, givptr, givcol, ldgcol, perm, givnum, c, s, work, iwork, info)
SLASDA computes the singular value decomposition (SVD) of a real upper bidiagonal matrix with diagona...
subroutine slasdq(uplo, sqre, n, ncvt, nru, ncc, d, e, vt, ldvt, u, ldu, c, ldc, work, info)
SLASDQ computes the SVD of a real bidiagonal matrix with diagonal d and off-diagonal e....
subroutine slaset(uplo, m, n, alpha, beta, a, lda)
SLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine slartg(f, g, c, s, r)
SLARTG generates a plane rotation with real cosine and real sine.
subroutine slacpy(uplo, m, n, a, lda, b, ldb)
SLACPY copies all or part of one two-dimensional array to another.
subroutine slascl(type, kl, ku, cfrom, cto, m, n, a, lda, info)
SLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine slasrt(id, n, d, info)
SLASRT sorts numbers in increasing or decreasing order.
subroutine xerbla(srname, info)
XERBLA
subroutine slalsa(icompq, smlsiz, n, nrhs, b, ldb, bx, ldbx, u, ldu, vt, k, difl, difr, z, poles, givptr, givcol, ldgcol, perm, givnum, c, s, work, iwork, info)
SLALSA computes the SVD of the coefficient matrix in compact form. Used by sgelsd.
subroutine slalsd(uplo, smlsiz, n, nrhs, d, e, b, ldb, rcond, rank, work, iwork, info)
SLALSD uses the singular value decomposition of A to solve the least squares problem.
subroutine srot(n, sx, incx, sy, incy, c, s)
SROT
subroutine scopy(n, sx, incx, sy, incy)
SCOPY
subroutine sgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
SGEMM