265 SUBROUTINE dlals0( ICOMPQ, NL, NR, SQRE, NRHS, B, LDB, BX, LDBX,
266 $ PERM, GIVPTR, GIVCOL, LDGCOL, GIVNUM, LDGNUM,
267 $ POLES, DIFL, DIFR, Z, K, C, S, WORK, INFO )
274 INTEGER GIVPTR, ICOMPQ, INFO, K, LDB, LDBX, LDGCOL,
275 $ ldgnum, nl, nr, nrhs, sqre
276 DOUBLE PRECISION C, S
279 INTEGER GIVCOL( ldgcol, * ), PERM( * )
280 DOUBLE PRECISION B( ldb, * ), BX( ldbx, * ), DIFL( * ),
281 $ difr( ldgnum, * ), givnum( ldgnum, * ),
282 $ poles( ldgnum, * ), work( * ), z( * )
288 DOUBLE PRECISION ONE, ZERO, NEGONE
289 parameter( one = 1.0d0, zero = 0.0d0, negone = -1.0d0 )
292 INTEGER I, J, M, N, NLP1
293 DOUBLE PRECISION DIFLJ, DIFRJ, DJ, DSIGJ, DSIGJP, TEMP
300 DOUBLE PRECISION DLAMC3, DNRM2
301 EXTERNAL dlamc3, dnrm2
313 IF( ( icompq.LT.0 ) .OR. ( icompq.GT.1 ) )
THEN 315 ELSE IF( nl.LT.1 )
THEN 317 ELSE IF( nr.LT.1 )
THEN 319 ELSE IF( ( sqre.LT.0 ) .OR. ( sqre.GT.1 ) )
THEN 321 ELSE IF( nrhs.LT.1 )
THEN 323 ELSE IF( ldb.LT.n )
THEN 325 ELSE IF( ldbx.LT.n )
THEN 327 ELSE IF( givptr.LT.0 )
THEN 329 ELSE IF( ldgcol.LT.n )
THEN 331 ELSE IF( ldgnum.LT.n )
THEN 333 ELSE IF( k.LT.1 )
THEN 337 CALL xerbla(
'DLALS0', -info )
344 IF( icompq.EQ.0 )
THEN 351 CALL drot( nrhs, b( givcol( i, 2 ), 1 ), ldb,
352 $ b( givcol( i, 1 ), 1 ), ldb, givnum( i, 2 ),
358 CALL dcopy( nrhs, b( nlp1, 1 ), ldb, bx( 1, 1 ), ldbx )
360 CALL dcopy( nrhs, b( perm( i ), 1 ), ldb, bx( i, 1 ), ldbx )
367 CALL dcopy( nrhs, bx, ldbx, b, ldb )
368 IF( z( 1 ).LT.zero )
THEN 369 CALL dscal( nrhs, negone, b, ldb )
375 dsigj = -poles( j, 2 )
377 difrj = -difr( j, 1 )
378 dsigjp = -poles( j+1, 2 )
380 IF( ( z( j ).EQ.zero ) .OR. ( poles( j, 2 ).EQ.zero ) )
384 work( j ) = -poles( j, 2 )*z( j ) / diflj /
385 $ ( poles( j, 2 )+dj )
388 IF( ( z( i ).EQ.zero ) .OR.
389 $ ( poles( i, 2 ).EQ.zero ) )
THEN 392 work( i ) = poles( i, 2 )*z( i ) /
393 $ ( dlamc3( poles( i, 2 ), dsigj )-
394 $ diflj ) / ( poles( i, 2 )+dj )
398 IF( ( z( i ).EQ.zero ) .OR.
399 $ ( poles( i, 2 ).EQ.zero ) )
THEN 402 work( i ) = poles( i, 2 )*z( i ) /
403 $ ( dlamc3( poles( i, 2 ), dsigjp )+
404 $ difrj ) / ( poles( i, 2 )+dj )
408 temp = dnrm2( k, work, 1 )
409 CALL dgemv(
'T', k, nrhs, one, bx, ldbx, work, 1, zero,
411 CALL dlascl(
'G', 0, 0, temp, one, 1, nrhs, b( j, 1 ),
418 IF( k.LT.max( m, n ) )
419 $
CALL dlacpy(
'A', n-k, nrhs, bx( k+1, 1 ), ldbx,
429 CALL dcopy( nrhs, b, ldb, bx, ldbx )
432 dsigj = poles( j, 2 )
433 IF( z( j ).EQ.zero )
THEN 436 work( j ) = -z( j ) / difl( j ) /
437 $ ( dsigj+poles( j, 1 ) ) / difr( j, 2 )
440 IF( z( j ).EQ.zero )
THEN 443 work( i ) = z( j ) / ( dlamc3( dsigj, -poles( i+1,
444 $ 2 ) )-difr( i, 1 ) ) /
445 $ ( dsigj+poles( i, 1 ) ) / difr( i, 2 )
449 IF( z( j ).EQ.zero )
THEN 452 work( i ) = z( j ) / ( dlamc3( dsigj, -poles( i,
453 $ 2 ) )-difl( i ) ) /
454 $ ( dsigj+poles( i, 1 ) ) / difr( i, 2 )
457 CALL dgemv(
'T', k, nrhs, one, b, ldb, work, 1, zero,
466 CALL dcopy( nrhs, b( m, 1 ), ldb, bx( m, 1 ), ldbx )
467 CALL drot( nrhs, bx( 1, 1 ), ldbx, bx( m, 1 ), ldbx, c, s )
469 IF( k.LT.max( m, n ) )
470 $
CALL dlacpy(
'A', n-k, nrhs, b( k+1, 1 ), ldb, bx( k+1, 1 ),
475 CALL dcopy( nrhs, bx( 1, 1 ), ldbx, b( nlp1, 1 ), ldb )
477 CALL dcopy( nrhs, bx( m, 1 ), ldbx, b( m, 1 ), ldb )
480 CALL dcopy( nrhs, bx( i, 1 ), ldbx, b( perm( i ), 1 ), ldb )
485 DO 100 i = givptr, 1, -1
486 CALL drot( nrhs, b( givcol( i, 2 ), 1 ), ldb,
487 $ b( givcol( i, 1 ), 1 ), ldb, givnum( i, 2 ),
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine dlacpy(UPLO, M, N, A, LDA, B, LDB)
DLACPY copies all or part of one two-dimensional array to another.
subroutine dlals0(ICOMPQ, NL, NR, SQRE, NRHS, B, LDB, BX, LDBX, PERM, GIVPTR, GIVCOL, LDGCOL, GIVNUM, LDGNUM, POLES, DIFL, DIFR, Z, K, C, S, WORK, INFO)
DLALS0 applies back multiplying factors in solving the least squares problem using divide and conquer...
subroutine dgemv(TRANS, M, N, ALPHA, A, LDA, X, INCX, BETA, Y, INCY)
DGEMV
subroutine dscal(N, DA, DX, INCX)
DSCAL
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 drot(N, DX, INCX, DY, INCY, C, S)
DROT
subroutine dcopy(N, DX, INCX, DY, INCY)
DCOPY