130 SUBROUTINE csytrs2( UPLO, N, NRHS, A, LDA, IPIV, B, LDB,
139 INTEGER INFO, LDA, LDB, N, NRHS
143 COMPLEX A( LDA, * ), B( LDB, * ), WORK( * )
150 parameter( one = (1.0e+0,0.0e+0) )
154 INTEGER I, IINFO, J, K, KP
155 COMPLEX AK, AKM1, AKM1K, BK, BKM1, DENOM
170 upper = lsame( uplo,
'U' )
171 IF( .NOT.upper .AND. .NOT.lsame( uplo,
'L' ) )
THEN
173 ELSE IF( n.LT.0 )
THEN
175 ELSE IF( nrhs.LT.0 )
THEN
177 ELSE IF( lda.LT.max( 1, n ) )
THEN
179 ELSE IF( ldb.LT.max( 1, n ) )
THEN
183 CALL xerbla(
'CSYTRS2', -info )
189 IF( n.EQ.0 .OR. nrhs.EQ.0 )
194 CALL csyconv( uplo,
'C', n, a, lda, ipiv, work, iinfo )
202 DO WHILE ( k .GE. 1 )
203 IF( ipiv( k ).GT.0 )
THEN
208 $
CALL cswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
214 IF( kp.EQ.-ipiv( k-1 ) )
215 $
CALL cswap( nrhs, b( k-1, 1 ), ldb, b( kp, 1 ), ldb )
222 CALL ctrsm(
'L',
'U',
'N',
'U',n,nrhs,one,a,lda,b,ldb)
227 DO WHILE ( i .GE. 1 )
228 IF( ipiv(i) .GT. 0 )
THEN
229 CALL cscal( nrhs, one / a( i, i ), b( i, 1 ), ldb )
230 ELSEIF ( i .GT. 1)
THEN
231 IF ( ipiv(i-1) .EQ. ipiv(i) )
THEN
233 akm1 = a( i-1, i-1 ) / akm1k
234 ak = a( i, i ) / akm1k
235 denom = akm1*ak - one
237 bkm1 = b( i-1, j ) / akm1k
238 bk = b( i, j ) / akm1k
239 b( i-1, j ) = ( ak*bkm1-bk ) / denom
240 b( i, j ) = ( akm1*bk-bkm1 ) / denom
250 CALL ctrsm(
'L',
'U',
'T',
'U',n,nrhs,one,a,lda,b,ldb)
255 DO WHILE ( k .LE. n )
256 IF( ipiv( k ).GT.0 )
THEN
261 $
CALL cswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
267 IF( k .LT. n .AND. kp.EQ.-ipiv( k+1 ) )
268 $
CALL cswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
279 DO WHILE ( k .LE. n )
280 IF( ipiv( k ).GT.0 )
THEN
285 $
CALL cswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
291 IF( kp.EQ.-ipiv( k ) )
292 $
CALL cswap( nrhs, b( k+1, 1 ), ldb, b( kp, 1 ), ldb )
299 CALL ctrsm(
'L',
'L',
'N',
'U',n,nrhs,one,a,lda,b,ldb)
304 DO WHILE ( i .LE. n )
305 IF( ipiv(i) .GT. 0 )
THEN
306 CALL cscal( nrhs, one / a( i, i ), b( i, 1 ), ldb )
309 akm1 = a( i, i ) / akm1k
310 ak = a( i+1, i+1 ) / akm1k
311 denom = akm1*ak - one
313 bkm1 = b( i, j ) / akm1k
314 bk = b( i+1, j ) / akm1k
315 b( i, j ) = ( ak*bkm1-bk ) / denom
316 b( i+1, j ) = ( akm1*bk-bkm1 ) / denom
325 CALL ctrsm(
'L',
'L',
'T',
'U',n,nrhs,one,a,lda,b,ldb)
330 DO WHILE ( k .GE. 1 )
331 IF( ipiv( k ).GT.0 )
THEN
336 $
CALL cswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
342 IF( k.GT.1 .AND. kp.EQ.-ipiv( k-1 ) )
343 $
CALL cswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
352 CALL csyconv( uplo,
'R', n, a, lda, ipiv, work, iinfo )
subroutine xerbla(srname, info)
subroutine csytrs2(uplo, n, nrhs, a, lda, ipiv, b, ldb, work, info)
CSYTRS2
subroutine cscal(n, ca, cx, incx)
CSCAL
subroutine cswap(n, cx, incx, cy, incy)
CSWAP
subroutine csyconv(uplo, way, n, a, lda, ipiv, e, info)
CSYCONV
subroutine ctrsm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
CTRSM