125
  126
  127
  128
  129
  130
  131      CHARACTER          UPLO
  132      INTEGER            INFO, LDA, LDB, N, NRHS
  133
  134
  135      INTEGER            IPIV( * )
  136      COMPLEX            A( LDA, * ), B( LDB, * ), WORK( * )
  137
  138
  139
  140
  141
  142      COMPLEX            ONE
  143      parameter( one = (1.0e+0,0.0e+0) )
  144
  145
  146      LOGICAL            UPPER
  147      INTEGER            I, IINFO, J, K, KP
  148      REAL               S
  149      COMPLEX            AK, AKM1, AKM1K, BK, BKM1, DENOM
  150
  151
  152      LOGICAL            LSAME
  154
  155
  158
  159
  160      INTRINSIC          conjg, max, real
  161
  162
  163
  164      info = 0
  165      upper = 
lsame( uplo, 
'U' )
 
  166      IF( .NOT.upper .AND. .NOT.
lsame( uplo, 
'L' ) ) 
THEN 
  167         info = -1
  168      ELSE IF( n.LT.0 ) THEN
  169         info = -2
  170      ELSE IF( nrhs.LT.0 ) THEN
  171         info = -3
  172      ELSE IF( lda.LT.max( 1, n ) ) THEN
  173         info = -5
  174      ELSE IF( ldb.LT.max( 1, n ) ) THEN
  175         info = -8
  176      END IF
  177      IF( info.NE.0 ) THEN
  178         CALL xerbla( 
'CHETRS2', -info )
 
  179         RETURN
  180      END IF
  181
  182
  183
  184      IF( n.EQ.0 .OR. nrhs.EQ.0 )
  185     $   RETURN
  186
  187
  188
  189      CALL csyconv( uplo, 
'C', n, a, lda, ipiv, work, iinfo )
 
  190
  191      IF( upper ) THEN
  192
  193
  194
  195
  196        k=n
  197        DO WHILE ( k .GE. 1 )
  198         IF( ipiv( k ).GT.0 ) THEN
  199
  200
  201            kp = ipiv( k )
  202            IF( kp.NE.k )
  203     $         
CALL cswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
 
  204            k=k-1
  205         ELSE
  206
  207
  208            kp = -ipiv( k )
  209            IF( kp.EQ.-ipiv( k-1 ) )
  210     $         
CALL cswap( nrhs, b( k-1, 1 ), ldb, b( kp, 1 ), ldb )
 
  211            k=k-2
  212         END IF
  213        END DO
  214
  215
  216
  217        CALL ctrsm(
'L',
'U',
'N',
'U',n,nrhs,one,a,lda,b,ldb)
 
  218
  219
  220
  221         i=n
  222         DO WHILE ( i .GE. 1 )
  223            IF( ipiv(i) .GT. 0 ) THEN
  224              s = real( one ) / real( a( i, i ) )
  225              CALL csscal( nrhs, s, b( i, 1 ), ldb )
 
  226            ELSEIF ( i .GT. 1) THEN
  227               IF ( ipiv(i-1) .EQ. ipiv(i) ) THEN
  228                  akm1k = work(i)
  229                  akm1 = a( i-1, i-1 ) / akm1k
  230                  ak = a( i, i ) / conjg( akm1k )
  231                  denom = akm1*ak - one
  232                  DO 15 j = 1, nrhs
  233                     bkm1 = b( i-1, j ) / akm1k
  234                     bk = b( i, j ) / conjg( akm1k )
  235                     b( i-1, j ) = ( ak*bkm1-bk ) / denom
  236                     b( i, j ) = ( akm1*bk-bkm1 ) / denom
  237 15              CONTINUE
  238               i = i - 1
  239               ENDIF
  240            ENDIF
  241            i = i - 1
  242         END DO
  243
  244
  245
  246         CALL ctrsm(
'L',
'U',
'C',
'U',n,nrhs,one,a,lda,b,ldb)
 
  247
  248
  249
  250        k=1
  251        DO WHILE ( k .LE. n )
  252         IF( ipiv( k ).GT.0 ) THEN
  253
  254
  255            kp = ipiv( k )
  256            IF( kp.NE.k )
  257     $         
CALL cswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
 
  258            k=k+1
  259         ELSE
  260
  261
  262            kp = -ipiv( k )
  263            IF( k .LT. n .AND. kp.EQ.-ipiv( k+1 ) )
  264     $         
CALL cswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
 
  265            k=k+2
  266         ENDIF
  267        END DO
  268
  269      ELSE
  270
  271
  272
  273
  274        k=1
  275        DO WHILE ( k .LE. n )
  276         IF( ipiv( k ).GT.0 ) THEN
  277
  278
  279            kp = ipiv( k )
  280            IF( kp.NE.k )
  281     $         
CALL cswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
 
  282            k=k+1
  283         ELSE
  284
  285
  286            kp = -ipiv( k+1 )
  287            IF( kp.EQ.-ipiv( k ) )
  288     $         
CALL cswap( nrhs, b( k+1, 1 ), ldb, b( kp, 1 ), ldb )
 
  289            k=k+2
  290         ENDIF
  291        END DO
  292
  293
  294
  295        CALL ctrsm(
'L',
'L',
'N',
'U',n,nrhs,one,a,lda,b,ldb)
 
  296
  297
  298
  299         i=1
  300         DO WHILE ( i .LE. n )
  301            IF( ipiv(i) .GT. 0 ) THEN
  302              s = real( one ) / real( a( i, i ) )
  303              CALL csscal( nrhs, s, b( i, 1 ), ldb )
 
  304            ELSE
  305                  akm1k = work(i)
  306                  akm1 = a( i, i ) / conjg( akm1k )
  307                  ak = a( i+1, i+1 ) / akm1k
  308                  denom = akm1*ak - one
  309                  DO 25 j = 1, nrhs
  310                     bkm1 = b( i, j ) / conjg( akm1k )
  311                     bk = b( i+1, j ) / akm1k
  312                     b( i, j ) = ( ak*bkm1-bk ) / denom
  313                     b( i+1, j ) = ( akm1*bk-bkm1 ) / denom
  314 25              CONTINUE
  315                  i = i + 1
  316            ENDIF
  317            i = i + 1
  318         END DO
  319
  320
  321
  322        CALL ctrsm(
'L',
'L',
'C',
'U',n,nrhs,one,a,lda,b,ldb)
 
  323
  324
  325
  326        k=n
  327        DO WHILE ( k .GE. 1 )
  328         IF( ipiv( k ).GT.0 ) THEN
  329
  330
  331            kp = ipiv( k )
  332            IF( kp.NE.k )
  333     $         
CALL cswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
 
  334            k=k-1
  335         ELSE
  336
  337
  338            kp = -ipiv( k )
  339            IF( k.GT.1 .AND. kp.EQ.-ipiv( k-1 ) )
  340     $         
CALL cswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
 
  341            k=k-2
  342         ENDIF
  343        END DO
  344
  345      END IF
  346
  347
  348
  349      CALL csyconv( uplo, 
'R', n, a, lda, ipiv, work, iinfo )
 
  350
  351      RETURN
  352
  353
  354
subroutine xerbla(srname, info)
logical function lsame(ca, cb)
LSAME
subroutine csscal(n, sa, cx, incx)
CSSCAL
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