001:       SUBROUTINE CTPTRS( UPLO, TRANS, DIAG, N, NRHS, AP, B, LDB, INFO )
002: *
003: *  -- LAPACK routine (version 3.2) --
004: *     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
005: *     November 2006
006: *
007: *     .. Scalar Arguments ..
008:       CHARACTER          DIAG, TRANS, UPLO
009:       INTEGER            INFO, LDB, N, NRHS
010: *     ..
011: *     .. Array Arguments ..
012:       COMPLEX            AP( * ), B( LDB, * )
013: *     ..
014: *
015: *  Purpose
016: *  =======
017: *
018: *  CTPTRS solves a triangular system of the form
019: *
020: *     A * X = B,  A**T * X = B,  or  A**H * X = B,
021: *
022: *  where A is a triangular matrix of order N stored in packed format,
023: *  and B is an N-by-NRHS matrix.  A check is made to verify that A is
024: *  nonsingular.
025: *
026: *  Arguments
027: *  =========
028: *
029: *  UPLO    (input) CHARACTER*1
030: *          = 'U':  A is upper triangular;
031: *          = 'L':  A is lower triangular.
032: *
033: *  TRANS   (input) CHARACTER*1
034: *          Specifies the form of the system of equations:
035: *          = 'N':  A * X = B     (No transpose)
036: *          = 'T':  A**T * X = B  (Transpose)
037: *          = 'C':  A**H * X = B  (Conjugate transpose)
038: *
039: *  DIAG    (input) CHARACTER*1
040: *          = 'N':  A is non-unit triangular;
041: *          = 'U':  A is unit triangular.
042: *
043: *  N       (input) INTEGER
044: *          The order of the matrix A.  N >= 0.
045: *
046: *  NRHS    (input) INTEGER
047: *          The number of right hand sides, i.e., the number of columns
048: *          of the matrix B.  NRHS >= 0.
049: *
050: *  AP      (input) COMPLEX array, dimension (N*(N+1)/2)
051: *          The upper or lower triangular matrix A, packed columnwise in
052: *          a linear array.  The j-th column of A is stored in the array
053: *          AP as follows:
054: *          if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j;
055: *          if UPLO = 'L', AP(i + (j-1)*(2*n-j)/2) = A(i,j) for j<=i<=n.
056: *
057: *  B       (input/output) COMPLEX array, dimension (LDB,NRHS)
058: *          On entry, the right hand side matrix B.
059: *          On exit, if INFO = 0, the solution matrix X.
060: *
061: *  LDB     (input) INTEGER
062: *          The leading dimension of the array B.  LDB >= max(1,N).
063: *
064: *  INFO    (output) INTEGER
065: *          = 0:  successful exit
066: *          < 0:  if INFO = -i, the i-th argument had an illegal value
067: *          > 0:  if INFO = i, the i-th diagonal element of A is zero,
068: *                indicating that the matrix is singular and the
069: *                solutions X have not been computed.
070: *
071: *  =====================================================================
072: *
073: *     .. Parameters ..
074:       COMPLEX            ZERO
075:       PARAMETER          ( ZERO = ( 0.0E+0, 0.0E+0 ) )
076: *     ..
077: *     .. Local Scalars ..
078:       LOGICAL            NOUNIT, UPPER
079:       INTEGER            J, JC
080: *     ..
081: *     .. External Functions ..
082:       LOGICAL            LSAME
083:       EXTERNAL           LSAME
084: *     ..
085: *     .. External Subroutines ..
086:       EXTERNAL           CTPSV, XERBLA
087: *     ..
088: *     .. Intrinsic Functions ..
089:       INTRINSIC          MAX
090: *     ..
091: *     .. Executable Statements ..
092: *
093: *     Test the input parameters.
094: *
095:       INFO = 0
096:       UPPER = LSAME( UPLO, 'U' )
097:       NOUNIT = LSAME( DIAG, 'N' )
098:       IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
099:          INFO = -1
100:       ELSE IF( .NOT.LSAME( TRANS, 'N' ) .AND. .NOT.
101:      $         LSAME( TRANS, 'T' ) .AND. .NOT.LSAME( TRANS, 'C' ) ) THEN
102:          INFO = -2
103:       ELSE IF( .NOT.NOUNIT .AND. .NOT.LSAME( DIAG, 'U' ) ) THEN
104:          INFO = -3
105:       ELSE IF( N.LT.0 ) THEN
106:          INFO = -4
107:       ELSE IF( NRHS.LT.0 ) THEN
108:          INFO = -5
109:       ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
110:          INFO = -8
111:       END IF
112:       IF( INFO.NE.0 ) THEN
113:          CALL XERBLA( 'CTPTRS', -INFO )
114:          RETURN
115:       END IF
116: *
117: *     Quick return if possible
118: *
119:       IF( N.EQ.0 )
120:      $   RETURN
121: *
122: *     Check for singularity.
123: *
124:       IF( NOUNIT ) THEN
125:          IF( UPPER ) THEN
126:             JC = 1
127:             DO 10 INFO = 1, N
128:                IF( AP( JC+INFO-1 ).EQ.ZERO )
129:      $            RETURN
130:                JC = JC + INFO
131:    10       CONTINUE
132:          ELSE
133:             JC = 1
134:             DO 20 INFO = 1, N
135:                IF( AP( JC ).EQ.ZERO )
136:      $            RETURN
137:                JC = JC + N - INFO + 1
138:    20       CONTINUE
139:          END IF
140:       END IF
141:       INFO = 0
142: *
143: *     Solve  A * x = b,  A**T * x = b,  or  A**H * x = b.
144: *
145:       DO 30 J = 1, NRHS
146:          CALL CTPSV( UPLO, TRANS, DIAG, N, AP, B( 1, J ), 1 )
147:    30 CONTINUE
148: *
149:       RETURN
150: *
151: *     End of CTPTRS
152: *
153:       END
154: