263 SUBROUTINE dlals0( ICOMPQ, NL, NR, SQRE, NRHS, B, LDB, BX,
265 $ PERM, GIVPTR, GIVCOL, LDGCOL, GIVNUM, LDGNUM,
266 $ POLES, DIFL, DIFR, Z, K, C, S, WORK, INFO )
273 INTEGER GIVPTR, ICOMPQ, INFO, K, LDB, LDBX, LDGCOL,
274 $ LDGNUM, NL, NR, NRHS, SQRE
275 DOUBLE PRECISION C, S
278 INTEGER GIVCOL( LDGCOL, * ), PERM( * )
279 DOUBLE PRECISION B( LDB, * ), BX( LDBX, * ), DIFL( * ),
280 $ DIFR( LDGNUM, * ), GIVNUM( LDGNUM, * ),
281 $ poles( ldgnum, * ), work( * ), z( * )
287 DOUBLE PRECISION ONE, ZERO, NEGONE
288 PARAMETER ( ONE = 1.0d0, zero = 0.0d0, negone = -1.0d0 )
291 INTEGER I, J, M, N, NLP1
292 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 ),
368 CALL dcopy( nrhs, bx, ldbx, b, ldb )
369 IF( z( 1 ).LT.zero )
THEN
370 CALL dscal( nrhs, negone, b, ldb )
376 dsigj = -poles( j, 2 )
378 difrj = -difr( j, 1 )
379 dsigjp = -poles( j+1, 2 )
381 IF( ( z( j ).EQ.zero ) .OR. ( poles( j, 2 ).EQ.zero ) )
385 work( j ) = -poles( j, 2 )*z( j ) / diflj /
386 $ ( poles( j, 2 )+dj )
389 IF( ( z( i ).EQ.zero ) .OR.
390 $ ( poles( i, 2 ).EQ.zero ) )
THEN
398 work( i ) = poles( i, 2 )*z( i ) /
399 $ ( dlamc3( poles( i, 2 ), dsigj )-
400 $ diflj ) / ( poles( i, 2 )+dj )
404 IF( ( z( i ).EQ.zero ) .OR.
405 $ ( poles( i, 2 ).EQ.zero ) )
THEN
408 work( i ) = poles( i, 2 )*z( i ) /
409 $ ( dlamc3( poles( i, 2 ), dsigjp )+
410 $ difrj ) / ( poles( i, 2 )+dj )
414 temp = dnrm2( k, work, 1 )
415 CALL dgemv(
'T', k, nrhs, one, bx, ldbx, work, 1,
418 CALL dlascl(
'G', 0, 0, temp, one, 1, nrhs, b( j, 1 ),
425 IF( k.LT.max( m, n ) )
426 $
CALL dlacpy(
'A', n-k, nrhs, bx( k+1, 1 ), ldbx,
436 CALL dcopy( nrhs, b, ldb, bx, ldbx )
439 dsigj = poles( j, 2 )
440 IF( z( j ).EQ.zero )
THEN
443 work( j ) = -z( j ) / difl( j ) /
444 $ ( dsigj+poles( j, 1 ) ) / difr( j, 2 )
447 IF( z( j ).EQ.zero )
THEN
455 work( i ) = z( j ) / ( dlamc3( dsigj,
457 $ 2 ) )-difr( i, 1 ) ) /
458 $ ( dsigj+poles( i, 1 ) ) / difr( i, 2 )
462 IF( z( j ).EQ.zero )
THEN
465 work( i ) = z( j ) / ( dlamc3( dsigj, -poles( i,
466 $ 2 ) )-difl( i ) ) /
467 $ ( dsigj+poles( i, 1 ) ) / difr( i, 2 )
470 CALL dgemv(
'T', k, nrhs, one, b, ldb, work, 1, zero,
479 CALL dcopy( nrhs, b( m, 1 ), ldb, bx( m, 1 ), ldbx )
480 CALL drot( nrhs, bx( 1, 1 ), ldbx, bx( m, 1 ), ldbx, c,
483 IF( k.LT.max( m, n ) )
484 $
CALL dlacpy(
'A', n-k, nrhs, b( k+1, 1 ), ldb, bx( k+1,
490 CALL dcopy( nrhs, bx( 1, 1 ), ldbx, b( nlp1, 1 ), ldb )
492 CALL dcopy( nrhs, bx( m, 1 ), ldbx, b( m, 1 ), ldb )
495 CALL dcopy( nrhs, bx( i, 1 ), ldbx, b( perm( i ), 1 ),
501 DO 100 i = givptr, 1, -1
502 CALL drot( nrhs, b( givcol( i, 2 ), 1 ), ldb,
503 $ b( givcol( i, 1 ), 1 ), ldb, givnum( i, 2 ),
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...