267 SUBROUTINE clals0( ICOMPQ, NL, NR, SQRE, NRHS, B, LDB, BX, LDBX,
268 $ PERM, GIVPTR, GIVCOL, LDGCOL, GIVNUM, LDGNUM,
269 $ POLES, DIFL, DIFR, Z, K, C, S, RWORK, INFO )
276 INTEGER GIVPTR, ICOMPQ, INFO, K, LDB, LDBX, LDGCOL,
277 $ ldgnum, nl, nr, nrhs, sqre
281 INTEGER GIVCOL( ldgcol, * ), PERM( * )
282 REAL DIFL( * ), DIFR( ldgnum, * ),
283 $ givnum( ldgnum, * ), poles( ldgnum, * ),
285 COMPLEX B( ldb, * ), BX( ldbx, * )
291 REAL ONE, ZERO, NEGONE
292 parameter( one = 1.0e0, zero = 0.0e0, negone = -1.0e0 )
295 INTEGER I, J, JCOL, JROW, M, N, NLP1
296 REAL DIFLJ, DIFRJ, DJ, DSIGJ, DSIGJP, TEMP
304 EXTERNAL slamc3, snrm2
307 INTRINSIC aimag, cmplx, max, real
316 IF( ( icompq.LT.0 ) .OR. ( icompq.GT.1 ) )
THEN 318 ELSE IF( nl.LT.1 )
THEN 320 ELSE IF( nr.LT.1 )
THEN 322 ELSE IF( ( sqre.LT.0 ) .OR. ( sqre.GT.1 ) )
THEN 324 ELSE IF( nrhs.LT.1 )
THEN 326 ELSE IF( ldb.LT.n )
THEN 328 ELSE IF( ldbx.LT.n )
THEN 330 ELSE IF( givptr.LT.0 )
THEN 332 ELSE IF( ldgcol.LT.n )
THEN 334 ELSE IF( ldgnum.LT.n )
THEN 336 ELSE IF( k.LT.1 )
THEN 340 CALL xerbla(
'CLALS0', -info )
347 IF( icompq.EQ.0 )
THEN 354 CALL csrot( nrhs, b( givcol( i, 2 ), 1 ), ldb,
355 $ b( givcol( i, 1 ), 1 ), ldb, givnum( i, 2 ),
361 CALL ccopy( nrhs, b( nlp1, 1 ), ldb, bx( 1, 1 ), ldbx )
363 CALL ccopy( nrhs, b( perm( i ), 1 ), ldb, bx( i, 1 ), ldbx )
370 CALL ccopy( nrhs, bx, ldbx, b, ldb )
371 IF( z( 1 ).LT.zero )
THEN 372 CALL csscal( nrhs, negone, b, ldb )
378 dsigj = -poles( j, 2 )
380 difrj = -difr( j, 1 )
381 dsigjp = -poles( j+1, 2 )
383 IF( ( z( j ).EQ.zero ) .OR. ( poles( j, 2 ).EQ.zero ) )
387 rwork( j ) = -poles( j, 2 )*z( j ) / diflj /
388 $ ( poles( j, 2 )+dj )
391 IF( ( z( i ).EQ.zero ) .OR.
392 $ ( poles( i, 2 ).EQ.zero ) )
THEN 395 rwork( i ) = poles( i, 2 )*z( i ) /
396 $ ( slamc3( poles( i, 2 ), dsigj )-
397 $ diflj ) / ( poles( i, 2 )+dj )
401 IF( ( z( i ).EQ.zero ) .OR.
402 $ ( poles( i, 2 ).EQ.zero ) )
THEN 405 rwork( i ) = poles( i, 2 )*z( i ) /
406 $ ( slamc3( poles( i, 2 ), dsigjp )+
407 $ difrj ) / ( poles( i, 2 )+dj )
411 temp = snrm2( k, rwork, 1 )
423 rwork( i ) =
REAL( BX( JROW, JCOL ) )
426 CALL sgemv(
'T', k, nrhs, one, rwork( 1+k+nrhs*2 ), k,
427 $ rwork( 1 ), 1, zero, rwork( 1+k ), 1 )
432 rwork( i ) = aimag( bx( jrow, jcol ) )
435 CALL sgemv(
'T', k, nrhs, one, rwork( 1+k+nrhs*2 ), k,
436 $ rwork( 1 ), 1, zero, rwork( 1+k+nrhs ), 1 )
438 b( j, jcol ) = cmplx( rwork( jcol+k ),
439 $ rwork( jcol+k+nrhs ) )
441 CALL clascl(
'G', 0, 0, temp, one, 1, nrhs, b( j, 1 ),
448 IF( k.LT.max( m, n ) )
449 $
CALL clacpy(
'A', n-k, nrhs, bx( k+1, 1 ), ldbx,
459 CALL ccopy( nrhs, b, ldb, bx, ldbx )
462 dsigj = poles( j, 2 )
463 IF( z( j ).EQ.zero )
THEN 466 rwork( j ) = -z( j ) / difl( j ) /
467 $ ( dsigj+poles( j, 1 ) ) / difr( j, 2 )
470 IF( z( j ).EQ.zero )
THEN 473 rwork( i ) = z( j ) / ( slamc3( dsigj, -poles( i+1,
474 $ 2 ) )-difr( i, 1 ) ) /
475 $ ( dsigj+poles( i, 1 ) ) / difr( i, 2 )
479 IF( z( j ).EQ.zero )
THEN 482 rwork( i ) = z( j ) / ( slamc3( dsigj, -poles( i,
483 $ 2 ) )-difl( i ) ) /
484 $ ( dsigj+poles( i, 1 ) ) / difr( i, 2 )
495 DO 140 jcol = 1, nrhs
498 rwork( i ) =
REAL( B( JROW, JCOL ) )
501 CALL sgemv(
'T', k, nrhs, one, rwork( 1+k+nrhs*2 ), k,
502 $ rwork( 1 ), 1, zero, rwork( 1+k ), 1 )
504 DO 160 jcol = 1, nrhs
507 rwork( i ) = aimag( b( jrow, jcol ) )
510 CALL sgemv(
'T', k, nrhs, one, rwork( 1+k+nrhs*2 ), k,
511 $ rwork( 1 ), 1, zero, rwork( 1+k+nrhs ), 1 )
512 DO 170 jcol = 1, nrhs
513 bx( j, jcol ) = cmplx( rwork( jcol+k ),
514 $ rwork( jcol+k+nrhs ) )
523 CALL ccopy( nrhs, b( m, 1 ), ldb, bx( m, 1 ), ldbx )
524 CALL csrot( nrhs, bx( 1, 1 ), ldbx, bx( m, 1 ), ldbx, c, s )
526 IF( k.LT.max( m, n ) )
527 $
CALL clacpy(
'A', n-k, nrhs, b( k+1, 1 ), ldb,
528 $ bx( k+1, 1 ), ldbx )
532 CALL ccopy( nrhs, bx( 1, 1 ), ldbx, b( nlp1, 1 ), ldb )
534 CALL ccopy( nrhs, bx( m, 1 ), ldbx, b( m, 1 ), ldb )
537 CALL ccopy( nrhs, bx( i, 1 ), ldbx, b( perm( i ), 1 ), ldb )
542 DO 200 i = givptr, 1, -1
543 CALL csrot( nrhs, b( givcol( i, 2 ), 1 ), ldb,
544 $ b( givcol( i, 1 ), 1 ), ldb, givnum( i, 2 ),
subroutine clacpy(UPLO, M, N, A, LDA, B, LDB)
CLACPY copies all or part of one two-dimensional array to another.
subroutine clals0(ICOMPQ, NL, NR, SQRE, NRHS, B, LDB, BX, LDBX, PERM, GIVPTR, GIVCOL, LDGCOL, GIVNUM, LDGNUM, POLES, DIFL, DIFR, Z, K, C, S, RWORK, INFO)
CLALS0 applies back multiplying factors in solving the least squares problem using divide and conquer...
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine csscal(N, SA, CX, INCX)
CSSCAL
subroutine ccopy(N, CX, INCX, CY, INCY)
CCOPY
subroutine csrot(N, CX, INCX, CY, INCY, C, S)
CSROT
subroutine clascl(TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO)
CLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine sgemv(TRANS, M, N, ALPHA, A, LDA, X, INCX, BETA, Y, INCY)
SGEMV