130 SUBROUTINE ssytrs2( UPLO, N, NRHS, A, LDA, IPIV, B, LDB,
139 INTEGER INFO, LDA, LDB, N, NRHS
143 REAL A( LDA, * ), B( LDB, * ), WORK( * )
150 parameter( one = 1.0e+0 )
154 INTEGER I, IINFO, J, K, KP
155 REAL 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(
'SSYTRS2', -info )
189 IF( n.EQ.0 .OR. nrhs.EQ.0 )
194 CALL ssyconv( uplo,
'C', n, a, lda, ipiv, work, iinfo )
202 DO WHILE ( k .GE. 1 )
203 IF( ipiv( k ).GT.0 )
THEN
208 $
CALL sswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
214 IF( kp.EQ.-ipiv( k-1 ) )
215 $
CALL sswap( nrhs, b( k-1, 1 ), ldb, b( kp, 1 ), ldb )
222 CALL strsm(
'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 sscal( 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 strsm(
'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 sswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
267 IF( k .LT. n .AND. kp.EQ.-ipiv( k+1 ) )
268 $
CALL sswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
279 DO WHILE ( k .LE. n )
280 IF( ipiv( k ).GT.0 )
THEN
285 $
CALL sswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
291 IF( kp.EQ.-ipiv( k ) )
292 $
CALL sswap( nrhs, b( k+1, 1 ), ldb, b( kp, 1 ), ldb )
299 CALL strsm(
'L',
'L','n
','u
',N,NRHS,ONE,A,LDA,B,LDB)
305.GT.
IF( IPIV(I) 0 ) THEN
306 CALL SSCAL( 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 STRSM('l
','l
','t
','u
',N,NRHS,ONE,A,LDA,B,LDB)
331.GT.
IF( IPIV( K )0 ) THEN
336 $ CALL SSWAP( NRHS, B( K, 1 ), LDB, B( KP, 1 ), LDB )
342.GT..AND..EQ.
IF( K1 KP-IPIV( K-1 ) )
343 $ CALL SSWAP( NRHS, B( K, 1 ), LDB, B( KP, 1 ), LDB )
352 CALL SSYCONV( UPLO, 'r
', N, A, LDA, IPIV, WORK, IINFO )
subroutine ssytrs2(uplo, n, nrhs, a, lda, ipiv, b, ldb, work, info)
SSYTRS2
subroutine strsm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
STRSM