1       SUBROUTINE ZLAGTM( TRANS, N, NRHS, ALPHA, DL, D, DU, X, LDX, BETA,
  2      $                   B, LDB )
  3 *
  4 *  -- LAPACK auxiliary routine (version 3.3.1) --
  5 *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
  6 *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  7 *  -- April 2011                                                      --
  8 *
  9 *     .. Scalar Arguments ..
 10       CHARACTER          TRANS
 11       INTEGER            LDB, LDX, N, NRHS
 12       DOUBLE PRECISION   ALPHA, BETA
 13 *     ..
 14 *     .. Array Arguments ..
 15       COMPLEX*16         B( LDB, * ), D( * ), DL( * ), DU( * ),
 16      $                   X( LDX, * )
 17 *     ..
 18 *
 19 *  Purpose
 20 *  =======
 21 *
 22 *  ZLAGTM performs a matrix-vector product of the form
 23 *
 24 *     B := alpha * A * X + beta * B
 25 *
 26 *  where A is a tridiagonal matrix of order N, B and X are N by NRHS
 27 *  matrices, and alpha and beta are real scalars, each of which may be
 28 *  0., 1., or -1.
 29 *
 30 *  Arguments
 31 *  =========
 32 *
 33 *  TRANS   (input) CHARACTER*1
 34 *          Specifies the operation applied to A.
 35 *          = 'N':  No transpose, B := alpha * A * X + beta * B
 36 *          = 'T':  Transpose,    B := alpha * A**T * X + beta * B
 37 *          = 'C':  Conjugate transpose, B := alpha * A**H * X + beta * B
 38 *
 39 *  N       (input) INTEGER
 40 *          The order of the matrix A.  N >= 0.
 41 *
 42 *  NRHS    (input) INTEGER
 43 *          The number of right hand sides, i.e., the number of columns
 44 *          of the matrices X and B.
 45 *
 46 *  ALPHA   (input) DOUBLE PRECISION
 47 *          The scalar alpha.  ALPHA must be 0., 1., or -1.; otherwise,
 48 *          it is assumed to be 0.
 49 *
 50 *  DL      (input) COMPLEX*16 array, dimension (N-1)
 51 *          The (n-1) sub-diagonal elements of T.
 52 *
 53 *  D       (input) COMPLEX*16 array, dimension (N)
 54 *          The diagonal elements of T.
 55 *
 56 *  DU      (input) COMPLEX*16 array, dimension (N-1)
 57 *          The (n-1) super-diagonal elements of T.
 58 *
 59 *  X       (input) COMPLEX*16 array, dimension (LDX,NRHS)
 60 *          The N by NRHS matrix X.
 61 *  LDX     (input) INTEGER
 62 *          The leading dimension of the array X.  LDX >= max(N,1).
 63 *
 64 *  BETA    (input) DOUBLE PRECISION
 65 *          The scalar beta.  BETA must be 0., 1., or -1.; otherwise,
 66 *          it is assumed to be 1.
 67 *
 68 *  B       (input/output) COMPLEX*16 array, dimension (LDB,NRHS)
 69 *          On entry, the N by NRHS matrix B.
 70 *          On exit, B is overwritten by the matrix expression
 71 *          B := alpha * A * X + beta * B.
 72 *
 73 *  LDB     (input) INTEGER
 74 *          The leading dimension of the array B.  LDB >= max(N,1).
 75 *
 76 *  =====================================================================
 77 *
 78 *     .. Parameters ..
 79       DOUBLE PRECISION   ONE, ZERO
 80       PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
 81 *     ..
 82 *     .. Local Scalars ..
 83       INTEGER            I, J
 84 *     ..
 85 *     .. External Functions ..
 86       LOGICAL            LSAME
 87       EXTERNAL           LSAME
 88 *     ..
 89 *     .. Intrinsic Functions ..
 90       INTRINSIC          DCONJG
 91 *     ..
 92 *     .. Executable Statements ..
 93 *
 94       IF( N.EQ.0 )
 95      $   RETURN
 96 *
 97 *     Multiply B by BETA if BETA.NE.1.
 98 *
 99       IF( BETA.EQ.ZERO ) THEN
100          DO 20 J = 1, NRHS
101             DO 10 I = 1, N
102                B( I, J ) = ZERO
103    10       CONTINUE
104    20    CONTINUE
105       ELSE IF( BETA.EQ.-ONE ) THEN
106          DO 40 J = 1, NRHS
107             DO 30 I = 1, N
108                B( I, J ) = -B( I, J )
109    30       CONTINUE
110    40    CONTINUE
111       END IF
112 *
113       IF( ALPHA.EQ.ONE ) THEN
114          IF( LSAME( TRANS, 'N' ) ) THEN
115 *
116 *           Compute B := B + A*X
117 *
118             DO 60 J = 1, NRHS
119                IF( N.EQ.1 ) THEN
120                   B( 1, J ) = B( 1, J ) + D( 1 )*X( 1, J )
121                ELSE
122                   B( 1, J ) = B( 1, J ) + D( 1 )*X( 1, J ) +
123      $                        DU( 1 )*X( 2, J )
124                   B( N, J ) = B( N, J ) + DL( N-1 )*X( N-1, J ) +
125      $                        D( N )*X( N, J )
126                   DO 50 I = 2, N - 1
127                      B( I, J ) = B( I, J ) + DL( I-1 )*X( I-1, J ) +
128      $                           D( I )*X( I, J ) + DU( I )*X( I+1, J )
129    50             CONTINUE
130                END IF
131    60       CONTINUE
132          ELSE IF( LSAME( TRANS, 'T' ) ) THEN
133 *
134 *           Compute B := B + A**T * X
135 *
136             DO 80 J = 1, NRHS
137                IF( N.EQ.1 ) THEN
138                   B( 1, J ) = B( 1, J ) + D( 1 )*X( 1, J )
139                ELSE
140                   B( 1, J ) = B( 1, J ) + D( 1 )*X( 1, J ) +
141      $                        DL( 1 )*X( 2, J )
142                   B( N, J ) = B( N, J ) + DU( N-1 )*X( N-1, J ) +
143      $                        D( N )*X( N, J )
144                   DO 70 I = 2, N - 1
145                      B( I, J ) = B( I, J ) + DU( I-1 )*X( I-1, J ) +
146      $                           D( I )*X( I, J ) + DL( I )*X( I+1, J )
147    70             CONTINUE
148                END IF
149    80       CONTINUE
150          ELSE IF( LSAME( TRANS, 'C' ) ) THEN
151 *
152 *           Compute B := B + A**H * X
153 *
154             DO 100 J = 1, NRHS
155                IF( N.EQ.1 ) THEN
156                   B( 1, J ) = B( 1, J ) + DCONJG( D( 1 ) )*X( 1, J )
157                ELSE
158                   B( 1, J ) = B( 1, J ) + DCONJG( D( 1 ) )*X( 1, J ) +
159      $                        DCONJG( DL( 1 ) )*X( 2, J )
160                   B( N, J ) = B( N, J ) + DCONJG( DU( N-1 ) )*
161      $                        X( N-1, J ) + DCONJG( D( N ) )*X( N, J )
162                   DO 90 I = 2, N - 1
163                      B( I, J ) = B( I, J ) + DCONJG( DU( I-1 ) )*
164      $                           X( I-1, J ) + DCONJG( D( I ) )*
165      $                           X( I, J ) + DCONJG( DL( I ) )*
166      $                           X( I+1, J )
167    90             CONTINUE
168                END IF
169   100       CONTINUE
170          END IF
171       ELSE IF( ALPHA.EQ.-ONE ) THEN
172          IF( LSAME( TRANS, 'N' ) ) THEN
173 *
174 *           Compute B := B - A*X
175 *
176             DO 120 J = 1, NRHS
177                IF( N.EQ.1 ) THEN
178                   B( 1, J ) = B( 1, J ) - D( 1 )*X( 1, J )
179                ELSE
180                   B( 1, J ) = B( 1, J ) - D( 1 )*X( 1, J ) -
181      $                        DU( 1 )*X( 2, J )
182                   B( N, J ) = B( N, J ) - DL( N-1 )*X( N-1, J ) -
183      $                        D( N )*X( N, J )
184                   DO 110 I = 2, N - 1
185                      B( I, J ) = B( I, J ) - DL( I-1 )*X( I-1, J ) -
186      $                           D( I )*X( I, J ) - DU( I )*X( I+1, J )
187   110             CONTINUE
188                END IF
189   120       CONTINUE
190          ELSE IF( LSAME( TRANS, 'T' ) ) THEN
191 *
192 *           Compute B := B - A**T *X
193 *
194             DO 140 J = 1, NRHS
195                IF( N.EQ.1 ) THEN
196                   B( 1, J ) = B( 1, J ) - D( 1 )*X( 1, J )
197                ELSE
198                   B( 1, J ) = B( 1, J ) - D( 1 )*X( 1, J ) -
199      $                        DL( 1 )*X( 2, J )
200                   B( N, J ) = B( N, J ) - DU( N-1 )*X( N-1, J ) -
201      $                        D( N )*X( N, J )
202                   DO 130 I = 2, N - 1
203                      B( I, J ) = B( I, J ) - DU( I-1 )*X( I-1, J ) -
204      $                           D( I )*X( I, J ) - DL( I )*X( I+1, J )
205   130             CONTINUE
206                END IF
207   140       CONTINUE
208          ELSE IF( LSAME( TRANS, 'C' ) ) THEN
209 *
210 *           Compute B := B - A**H *X
211 *
212             DO 160 J = 1, NRHS
213                IF( N.EQ.1 ) THEN
214                   B( 1, J ) = B( 1, J ) - DCONJG( D( 1 ) )*X( 1, J )
215                ELSE
216                   B( 1, J ) = B( 1, J ) - DCONJG( D( 1 ) )*X( 1, J ) -
217      $                        DCONJG( DL( 1 ) )*X( 2, J )
218                   B( N, J ) = B( N, J ) - DCONJG( DU( N-1 ) )*
219      $                        X( N-1, J ) - DCONJG( D( N ) )*X( N, J )
220                   DO 150 I = 2, N - 1
221                      B( I, J ) = B( I, J ) - DCONJG( DU( I-1 ) )*
222      $                           X( I-1, J ) - DCONJG( D( I ) )*
223      $                           X( I, J ) - DCONJG( DL( I ) )*
224      $                           X( I+1, J )
225   150             CONTINUE
226                END IF
227   160       CONTINUE
228          END IF
229       END IF
230       RETURN
231 *
232 *     End of ZLAGTM
233 *
234       END