ScaLAPACK 2.1  2.1
ScaLAPACK: Scalable Linear Algebra PACKage
sdttrsv.f
Go to the documentation of this file.
1  SUBROUTINE sdttrsv( UPLO, TRANS, N, NRHS, DL, D, DU,
2  $ B, LDB, INFO )
3 *
4 * -- ScaLAPACK auxiliary routine (version 2.0) --
5 * Univ. of Tennessee, Univ. of California Berkeley, Univ. of Colorado Denver
6 *
7 * Written by Andrew J. Cleary, University of Tennessee.
8 * August, 1996.
9 * Modified from SGTTRS:
10 * -- LAPACK routine (preliminary version) --
11 * Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd.,
12 * Courant Institute, Argonne National Lab, and Rice University
13 *
14 * .. Scalar Arguments ..
15  CHARACTER UPLO, TRANS
16  INTEGER INFO, LDB, N, NRHS
17 * ..
18 * .. Array Arguments ..
19  REAL B( LDB, * ), D( * ), DL( * ), DU( * )
20 * ..
21 *
22 * Purpose
23 * =======
24 *
25 * SDTTRSV solves one of the systems of equations
26 * L * X = B, L**T * X = B, or L**H * X = B,
27 * U * X = B, U**T * X = B, or U**H * X = B,
28 * with factors of the tridiagonal matrix A from the LU factorization
29 * computed by SDTTRF.
30 *
31 * Arguments
32 * =========
33 *
34 * UPLO (input) CHARACTER*1
35 * Specifies whether to solve with L or U.
36 *
37 * TRANS (input) CHARACTER
38 * Specifies the form of the system of equations:
39 * = 'N': A * X = B (No transpose)
40 * = 'T': A**T * X = B (Transpose)
41 * = 'C': A**H * X = B (Conjugate transpose)
42 *
43 * N (input) INTEGER
44 * The order of the matrix A. N >= 0.
45 *
46 * NRHS (input) INTEGER
47 * The number of right hand sides, i.e., the number of columns
48 * of the matrix B. NRHS >= 0.
49 *
50 * DL (input) COMPLEX array, dimension (N-1)
51 * The (n-1) multipliers that define the matrix L from the
52 * LU factorization of A.
53 *
54 * D (input) COMPLEX array, dimension (N)
55 * The n diagonal elements of the upper triangular matrix U from
56 * the LU factorization of A.
57 *
58 * DU (input) COMPLEX array, dimension (N-1)
59 * The (n-1) elements of the first superdiagonal of U.
60 *
61 * B (input/output) COMPLEX array, dimension (LDB,NRHS)
62 * On entry, the right hand side matrix B.
63 * On exit, B is overwritten by the solution matrix X.
64 *
65 * LDB (input) INTEGER
66 * The leading dimension of the array B. LDB >= max(1,N).
67 *
68 * INFO (output) INTEGER
69 * = 0: successful exit
70 * < 0: if INFO = -i, the i-th argument had an illegal value
71 *
72 * =====================================================================
73 *
74 * .. Local Scalars ..
75  LOGICAL LOWER, NOTRAN
76  INTEGER I, J
77 * ..
78 * .. External Functions ..
79  LOGICAL LSAME
80  EXTERNAL lsame
81 * ..
82 * .. External Subroutines ..
83  EXTERNAL xerbla
84 * ..
85 * .. Intrinsic Functions ..
86  INTRINSIC conjg, max
87 * ..
88 * .. Executable Statements ..
89 *
90  info = 0
91  notran = lsame( trans, 'N' )
92  lower = lsame( uplo, 'L' )
93  IF( .NOT.lower .AND. .NOT.lsame( uplo, 'U' ) ) THEN
94  info = -1
95  ELSE IF( .NOT.notran .AND. .NOT.lsame( trans, 'T' ) .AND. .NOT.
96  $ lsame( trans, 'C' ) ) THEN
97  info = -2
98  ELSE IF( n.LT.0 ) THEN
99  info = -3
100  ELSE IF( nrhs.LT.0 ) THEN
101  info = -4
102  ELSE IF( ldb.LT.max( n, 1 ) ) THEN
103  info = -9
104  END IF
105  IF( info.NE.0 ) THEN
106  CALL xerbla( 'SDTTRSV', -info )
107  RETURN
108  END IF
109 *
110 * Quick return if possible
111 *
112  IF( n.EQ.0 .OR. nrhs.EQ.0 )
113  $ RETURN
114 *
115  IF( notran ) THEN
116 *
117  IF( lower ) THEN
118 * Solve L*X = B, overwriting B with X.
119 *
120  DO 35 j = 1, nrhs
121 *
122 * Solve L*x = b.
123 *
124  DO 10 i = 1, n - 1
125  b( i+1, j ) = b( i+1, j ) - dl( i )*b( i, j )
126  10 CONTINUE
127  35 CONTINUE
128 *
129  ELSE
130 * Solve U*x = b.
131 *
132  DO 30 j = 1, nrhs
133  b( n, j ) = b( n, j ) / d( n )
134  IF( n.GT.1 )
135  $ b( n-1, j ) = ( b( n-1, j )-du( n-1 )*b( n, j ) ) /
136  $ d( n-1 )
137  DO 20 i = n - 2, 1, -1
138  b( i, j ) = ( b( i, j )-du( i )*b( i+1, j ) ) / d( i )
139  20 CONTINUE
140  30 CONTINUE
141 *
142  ENDIF
143 *
144  ELSE
145 *
146  IF( .NOT. lower ) THEN
147 * Solve U**T * X = B, overwriting B with X.
148 *
149  DO 65 j = 1, nrhs
150 *
151 * Solve U**T * x = b.
152 *
153  b( 1, j ) = b( 1, j ) / d( 1 )
154  IF( n.GT.1 )
155  $ b( 2, j ) = ( b( 2, j )-du( 1 )*b( 1, j ) ) / d( 2 )
156  DO 40 i = 3, n
157  b( i, j ) = ( b( i, j )-du( i-1 )*b( i-1, j ) ) / d( i )
158  40 CONTINUE
159  65 CONTINUE
160 *
161  ELSE
162 *
163 * Solve L**T * X = B, overwriting B with X.
164  DO 60 j = 1, nrhs
165 *
166 * Solve L**T * x = b.
167 *
168  DO 50 i = n - 1, 1, -1
169  b( i, j ) = b( i, j ) - dl( i )*b( i+1, j )
170  50 CONTINUE
171  60 CONTINUE
172  ENDIF
173  END IF
174 *
175 * End of SDTTRSV
176 *
177  END
max
#define max(A, B)
Definition: pcgemr.c:180
sdttrsv
subroutine sdttrsv(UPLO, TRANS, N, NRHS, DL, D, DU, B, LDB, INFO)
Definition: sdttrsv.f:3