270 SUBROUTINE slasda( ICOMPQ, SMLSIZ, N, SQRE, D, E, U, LDU, VT, K,
271 $ DIFL, DIFR, Z, POLES, GIVPTR, GIVCOL, LDGCOL,
272 $ PERM, GIVNUM, C, S, WORK, IWORK, INFO )
279 INTEGER ICOMPQ, INFO, LDGCOL, LDU, N, SMLSIZ, SQRE
282 INTEGER GIVCOL( ldgcol, * ), GIVPTR( * ), IWORK( * ),
283 $ k( * ), perm( ldgcol, * )
284 REAL C( * ), D( * ), DIFL( ldu, * ), DIFR( ldu, * ),
285 $ e( * ), givnum( ldu, * ), poles( ldu, * ),
286 $ s( * ), u( ldu, * ), vt( ldu, * ), work( * ),
294 parameter( zero = 0.0e+0, one = 1.0e+0 )
297 INTEGER I, I1, IC, IDXQ, IDXQI, IM1, INODE, ITEMP, IWK,
298 $ j, lf, ll, lvl, lvl2, m, ncc, nd, ndb1, ndiml,
299 $ ndimr, nl, nlf, nlp1, nlvl, nr, nrf, nrp1, nru,
300 $ nwork1, nwork2, smlszp, sqrei, vf, vfi, vl, vli
312 IF( ( icompq.LT.0 ) .OR. ( icompq.GT.1 ) )
THEN 314 ELSE IF( smlsiz.LT.3 )
THEN 316 ELSE IF( n.LT.0 )
THEN 318 ELSE IF( ( sqre.LT.0 ) .OR. ( sqre.GT.1 ) )
THEN 320 ELSE IF( ldu.LT.( n+sqre ) )
THEN 322 ELSE IF( ldgcol.LT.n )
THEN 326 CALL xerbla(
'SLASDA', -info )
334 IF( n.LE.smlsiz )
THEN 335 IF( icompq.EQ.0 )
THEN 336 CALL slasdq(
'U', sqre, n, 0, 0, 0, d, e, vt, ldu, u, ldu,
337 $ u, ldu, work, info )
339 CALL slasdq(
'U', sqre, n, m, n, 0, d, e, vt, ldu, u, ldu,
340 $ u, ldu, work, info )
360 nwork2 = nwork1 + smlszp*smlszp
362 CALL slasdt( n, nlvl, nd, iwork( inode ), iwork( ndiml ),
363 $ iwork( ndimr ), smlsiz )
378 ic = iwork( inode+i1 )
379 nl = iwork( ndiml+i1 )
381 nr = iwork( ndimr+i1 )
384 idxqi = idxq + nlf - 2
388 IF( icompq.EQ.0 )
THEN 389 CALL slaset(
'A', nlp1, nlp1, zero, one, work( nwork1 ),
391 CALL slasdq(
'U', sqrei, nl, nlp1, nru, ncc, d( nlf ),
392 $ e( nlf ), work( nwork1 ), smlszp,
393 $ work( nwork2 ), nl, work( nwork2 ), nl,
394 $ work( nwork2 ), info )
395 itemp = nwork1 + nl*smlszp
396 CALL scopy( nlp1, work( nwork1 ), 1, work( vfi ), 1 )
397 CALL scopy( nlp1, work( itemp ), 1, work( vli ), 1 )
399 CALL slaset(
'A', nl, nl, zero, one, u( nlf, 1 ), ldu )
400 CALL slaset(
'A', nlp1, nlp1, zero, one, vt( nlf, 1 ), ldu )
401 CALL slasdq(
'U', sqrei, nl, nlp1, nl, ncc, d( nlf ),
402 $ e( nlf ), vt( nlf, 1 ), ldu, u( nlf, 1 ), ldu,
403 $ u( nlf, 1 ), ldu, work( nwork1 ), info )
404 CALL scopy( nlp1, vt( nlf, 1 ), 1, work( vfi ), 1 )
405 CALL scopy( nlp1, vt( nlf, nlp1 ), 1, work( vli ), 1 )
413 IF( ( i.EQ.nd ) .AND. ( sqre.EQ.0 ) )
THEN 422 IF( icompq.EQ.0 )
THEN 423 CALL slaset(
'A', nrp1, nrp1, zero, one, work( nwork1 ),
425 CALL slasdq(
'U', sqrei, nr, nrp1, nru, ncc, d( nrf ),
426 $ e( nrf ), work( nwork1 ), smlszp,
427 $ work( nwork2 ), nr, work( nwork2 ), nr,
428 $ work( nwork2 ), info )
429 itemp = nwork1 + ( nrp1-1 )*smlszp
430 CALL scopy( nrp1, work( nwork1 ), 1, work( vfi ), 1 )
431 CALL scopy( nrp1, work( itemp ), 1, work( vli ), 1 )
433 CALL slaset(
'A', nr, nr, zero, one, u( nrf, 1 ), ldu )
434 CALL slaset(
'A', nrp1, nrp1, zero, one, vt( nrf, 1 ), ldu )
435 CALL slasdq(
'U', sqrei, nr, nrp1, nr, ncc, d( nrf ),
436 $ e( nrf ), vt( nrf, 1 ), ldu, u( nrf, 1 ), ldu,
437 $ u( nrf, 1 ), ldu, work( nwork1 ), info )
438 CALL scopy( nrp1, vt( nrf, 1 ), 1, work( vfi ), 1 )
439 CALL scopy( nrp1, vt( nrf, nrp1 ), 1, work( vli ), 1 )
452 DO 50 lvl = nlvl, 1, -1
467 ic = iwork( inode+im1 )
468 nl = iwork( ndiml+im1 )
469 nr = iwork( ndimr+im1 )
479 idxqi = idxq + nlf - 1
482 IF( icompq.EQ.0 )
THEN 483 CALL slasd6( icompq, nl, nr, sqrei, d( nlf ),
484 $ work( vfi ), work( vli ), alpha, beta,
485 $ iwork( idxqi ), perm, givptr( 1 ), givcol,
486 $ ldgcol, givnum, ldu, poles, difl, difr, z,
487 $ k( 1 ), c( 1 ), s( 1 ), work( nwork1 ),
488 $ iwork( iwk ), info )
491 CALL slasd6( icompq, nl, nr, sqrei, d( nlf ),
492 $ work( vfi ), work( vli ), alpha, beta,
493 $ iwork( idxqi ), perm( nlf, lvl ),
494 $ givptr( j ), givcol( nlf, lvl2 ), ldgcol,
495 $ givnum( nlf, lvl2 ), ldu,
496 $ poles( nlf, lvl2 ), difl( nlf, lvl ),
497 $ difr( nlf, lvl2 ), z( nlf, lvl ), k( j ),
498 $ c( j ), s( j ), work( nwork1 ),
499 $ iwork( iwk ), info )
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 xerbla(SRNAME, INFO)
XERBLA
subroutine slasd6(ICOMPQ, NL, NR, SQRE, D, VF, VL, ALPHA, BETA, IDXQ, PERM, GIVPTR, GIVCOL, LDGCOL, GIVNUM, LDGNUM, POLES, DIFL, DIFR, Z, K, C, S, WORK, IWORK, INFO)
SLASD6 computes the SVD of an updated upper bidiagonal matrix obtained by merging two smaller ones by...
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 scopy(N, SX, INCX, SY, INCY)
SCOPY
subroutine slasdt(N, LVL, ND, INODE, NDIML, NDIMR, MSUB)
SLASDT creates a tree of subproblems for bidiagonal divide and conquer. Used by sbdsdc.
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...