263 SUBROUTINE slals0( 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
278 INTEGER GIVCOL( LDGCOL, * ), PERM( * )
279 REAL B( LDB, * ), BX( LDBX, * ), DIFL( * ),
280 $ DIFR( LDGNUM, * ), GIVNUM( LDGNUM, * ),
281 $ poles( ldgnum, * ), work( * ), z( * )
287 REAL ONE, ZERO, NEGONE
288 PARAMETER ( ONE = 1.0e0, zero = 0.0e0, negone = -1.0e0 )
291 INTEGER I, J, M, N, NLP1
292 REAL DIFLJ, DIFRJ, DJ, DSIGJ, DSIGJP, TEMP
301 EXTERNAL SLAMC3, SNRM2
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(
'SLALS0', -info )
344 IF( icompq.EQ.0 )
THEN
351 CALL srot( nrhs, b( givcol( i, 2 ), 1 ), ldb,
352 $ b( givcol( i, 1 ), 1 ), ldb, givnum( i, 2 ),
358 CALL scopy( nrhs, b( nlp1, 1 ), ldb, bx( 1, 1 ), ldbx )
360 CALL scopy( nrhs, b( perm( i ), 1 ), ldb, bx( i, 1 ),
368 CALL scopy( nrhs, bx, ldbx, b, ldb )
369 IF( z( 1 ).LT.zero )
THEN
370 CALL sscal( 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 $ ( slamc3( 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 $ ( slamc3( poles( i, 2 ), dsigjp )+
410 $ difrj ) / ( poles( i, 2 )+dj )
414 temp = snrm2( k, work, 1 )
415 CALL sgemv(
'T', k, nrhs, one, bx, ldbx, work, 1,
418 CALL slascl(
'G', 0, 0, temp, one, 1, nrhs, b( j, 1 ),
425 IF( k.LT.max( m, n ) )
426 $
CALL slacpy(
'A', n-k, nrhs, bx( k+1, 1 ), ldbx,
436 CALL scopy( 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 ) / ( slamc3( 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 ) / ( slamc3( dsigj, -poles( i,
466 $ 2 ) )-difl( i ) ) /
467 $ ( dsigj+poles( i, 1 ) ) / difr( i, 2 )
470 CALL sgemv(
'T', k, nrhs, one, b, ldb, work, 1, zero,
479 CALL scopy( nrhs, b( m, 1 ), ldb, bx( m, 1 ), ldbx )
480 CALL srot( nrhs, bx( 1, 1 ), ldbx, bx( m, 1 ), ldbx, c,
483 IF( k.LT.max( m, n ) )
484 $
CALL slacpy(
'A', n-k, nrhs, b( k+1, 1 ), ldb, bx( k+1,
490 CALL scopy( nrhs, bx( 1, 1 ), ldbx, b( nlp1, 1 ), ldb )
492 CALL scopy( nrhs, bx( m, 1 ), ldbx, b( m, 1 ), ldb )
495 CALL scopy( nrhs, bx( i, 1 ), ldbx, b( perm( i ), 1 ),
501 DO 100 i = givptr, 1, -1
502 CALL srot( nrhs, b( givcol( i, 2 ), 1 ), ldb,
503 $ b( givcol( i, 1 ), 1 ), ldb, givnum( i, 2 ),
subroutine slals0(icompq, nl, nr, sqre, nrhs, b, ldb, bx, ldbx, perm, givptr, givcol, ldgcol, givnum, ldgnum, poles, difl, difr, z, k, c, s, work, info)
SLALS0 applies back multiplying factors in solving the least squares problem using divide and conquer...