Annotation of rpl/lapack/lapack/zptts2.f, revision 1.7

1.1       bertrand    1:       SUBROUTINE ZPTTS2( IUPLO, N, NRHS, D, E, B, LDB )
                      2: *
                      3: *  -- LAPACK routine (version 3.2) --
                      4: *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
                      5: *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
                      6: *     November 2006
                      7: *
                      8: *     .. Scalar Arguments ..
                      9:       INTEGER            IUPLO, LDB, N, NRHS
                     10: *     ..
                     11: *     .. Array Arguments ..
                     12:       DOUBLE PRECISION   D( * )
                     13:       COMPLEX*16         B( LDB, * ), E( * )
                     14: *     ..
                     15: *
                     16: *  Purpose
                     17: *  =======
                     18: *
                     19: *  ZPTTS2 solves a tridiagonal system of the form
                     20: *     A * X = B
                     21: *  using the factorization A = U'*D*U or A = L*D*L' computed by ZPTTRF.
                     22: *  D is a diagonal matrix specified in the vector D, U (or L) is a unit
                     23: *  bidiagonal matrix whose superdiagonal (subdiagonal) is specified in
                     24: *  the vector E, and X and B are N by NRHS matrices.
                     25: *
                     26: *  Arguments
                     27: *  =========
                     28: *
                     29: *  IUPLO   (input) INTEGER
                     30: *          Specifies the form of the factorization and whether the
                     31: *          vector E is the superdiagonal of the upper bidiagonal factor
                     32: *          U or the subdiagonal of the lower bidiagonal factor L.
                     33: *          = 1:  A = U'*D*U, E is the superdiagonal of U
                     34: *          = 0:  A = L*D*L', E is the subdiagonal of L
                     35: *
                     36: *  N       (input) INTEGER
                     37: *          The order of the tridiagonal matrix A.  N >= 0.
                     38: *
                     39: *  NRHS    (input) INTEGER
                     40: *          The number of right hand sides, i.e., the number of columns
                     41: *          of the matrix B.  NRHS >= 0.
                     42: *
                     43: *  D       (input) DOUBLE PRECISION array, dimension (N)
                     44: *          The n diagonal elements of the diagonal matrix D from the
                     45: *          factorization A = U'*D*U or A = L*D*L'.
                     46: *
                     47: *  E       (input) COMPLEX*16 array, dimension (N-1)
                     48: *          If IUPLO = 1, the (n-1) superdiagonal elements of the unit
                     49: *          bidiagonal factor U from the factorization A = U'*D*U.
                     50: *          If IUPLO = 0, the (n-1) subdiagonal elements of the unit
                     51: *          bidiagonal factor L from the factorization A = L*D*L'.
                     52: *
                     53: *  B       (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS)
                     54: *          On entry, the right hand side vectors B for the system of
                     55: *          linear equations.
                     56: *          On exit, the solution vectors, X.
                     57: *
                     58: *  LDB     (input) INTEGER
                     59: *          The leading dimension of the array B.  LDB >= max(1,N).
                     60: *
                     61: *  =====================================================================
                     62: *
                     63: *     .. Local Scalars ..
                     64:       INTEGER            I, J
                     65: *     ..
                     66: *     .. External Subroutines ..
                     67:       EXTERNAL           ZDSCAL
                     68: *     ..
                     69: *     .. Intrinsic Functions ..
                     70:       INTRINSIC          DCONJG
                     71: *     ..
                     72: *     .. Executable Statements ..
                     73: *
                     74: *     Quick return if possible
                     75: *
                     76:       IF( N.LE.1 ) THEN
                     77:          IF( N.EQ.1 )
                     78:      $      CALL ZDSCAL( NRHS, 1.D0 / D( 1 ), B, LDB )
                     79:          RETURN
                     80:       END IF
                     81: *
                     82:       IF( IUPLO.EQ.1 ) THEN
                     83: *
                     84: *        Solve A * X = B using the factorization A = U'*D*U,
                     85: *        overwriting each right hand side vector with its solution.
                     86: *
                     87:          IF( NRHS.LE.2 ) THEN
                     88:             J = 1
                     89:    10       CONTINUE
                     90: *
                     91: *           Solve U' * x = b.
                     92: *
                     93:             DO 20 I = 2, N
                     94:                B( I, J ) = B( I, J ) - B( I-1, J )*DCONJG( E( I-1 ) )
                     95:    20       CONTINUE
                     96: *
                     97: *           Solve D * U * x = b.
                     98: *
                     99:             DO 30 I = 1, N
                    100:                B( I, J ) = B( I, J ) / D( I )
                    101:    30       CONTINUE
                    102:             DO 40 I = N - 1, 1, -1
                    103:                B( I, J ) = B( I, J ) - B( I+1, J )*E( I )
                    104:    40       CONTINUE
                    105:             IF( J.LT.NRHS ) THEN
                    106:                J = J + 1
                    107:                GO TO 10
                    108:             END IF
                    109:          ELSE
                    110:             DO 70 J = 1, NRHS
                    111: *
                    112: *              Solve U' * x = b.
                    113: *
                    114:                DO 50 I = 2, N
                    115:                   B( I, J ) = B( I, J ) - B( I-1, J )*DCONJG( E( I-1 ) )
                    116:    50          CONTINUE
                    117: *
                    118: *              Solve D * U * x = b.
                    119: *
                    120:                B( N, J ) = B( N, J ) / D( N )
                    121:                DO 60 I = N - 1, 1, -1
                    122:                   B( I, J ) = B( I, J ) / D( I ) - B( I+1, J )*E( I )
                    123:    60          CONTINUE
                    124:    70       CONTINUE
                    125:          END IF
                    126:       ELSE
                    127: *
                    128: *        Solve A * X = B using the factorization A = L*D*L',
                    129: *        overwriting each right hand side vector with its solution.
                    130: *
                    131:          IF( NRHS.LE.2 ) THEN
                    132:             J = 1
                    133:    80       CONTINUE
                    134: *
                    135: *           Solve L * x = b.
                    136: *
                    137:             DO 90 I = 2, N
                    138:                B( I, J ) = B( I, J ) - B( I-1, J )*E( I-1 )
                    139:    90       CONTINUE
                    140: *
                    141: *           Solve D * L' * x = b.
                    142: *
                    143:             DO 100 I = 1, N
                    144:                B( I, J ) = B( I, J ) / D( I )
                    145:   100       CONTINUE
                    146:             DO 110 I = N - 1, 1, -1
                    147:                B( I, J ) = B( I, J ) - B( I+1, J )*DCONJG( E( I ) )
                    148:   110       CONTINUE
                    149:             IF( J.LT.NRHS ) THEN
                    150:                J = J + 1
                    151:                GO TO 80
                    152:             END IF
                    153:          ELSE
                    154:             DO 140 J = 1, NRHS
                    155: *
                    156: *              Solve L * x = b.
                    157: *
                    158:                DO 120 I = 2, N
                    159:                   B( I, J ) = B( I, J ) - B( I-1, J )*E( I-1 )
                    160:   120          CONTINUE
                    161: *
                    162: *              Solve D * L' * x = b.
                    163: *
                    164:                B( N, J ) = B( N, J ) / D( N )
                    165:                DO 130 I = N - 1, 1, -1
                    166:                   B( I, J ) = B( I, J ) / D( I ) -
                    167:      $                        B( I+1, J )*DCONJG( E( I ) )
                    168:   130          CONTINUE
                    169:   140       CONTINUE
                    170:          END IF
                    171:       END IF
                    172: *
                    173:       RETURN
                    174: *
                    175: *     End of ZPTTS2
                    176: *
                    177:       END

CVSweb interface <joel.bertrand@systella.fr>