/[ascend]/trunk/blas/dtrsv.f
ViewVC logotype

Contents of /trunk/blas/dtrsv.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1 - (show annotations) (download)
Fri Oct 29 20:54:12 2004 UTC (20 years, 1 month ago) by aw0a
File size: 7983 byte(s)
Setting up web subdirectory in repository
1 SUBROUTINE DTRSV ( UPLO, TRANS, DIAG, N, A, LDA, X, INCX )
2 *
3 ************************************************************************
4 *
5 * .. Scalar Arguments ..
6 INTEGER INCX, LDA, N
7 CHARACTER*1 DIAG, TRANS, UPLO
8 * .. Array Arguments ..
9 DOUBLE PRECISION A( LDA, N ), X( * )
10 * ..
11 *
12 * Purpose
13 * =======
14 *
15 * DTRSV solves one of the systems of equations
16 *
17 * A*x = b, or A'*x = b,
18 *
19 * where b and x are n element vectors and A is an n by n unit, or
20 * non-unit, upper or lower triangular matrix.
21 *
22 * No test for singularity or near-singularity is included in this
23 * routine. Such tests must be performed before calling this routine.
24 *
25 * Parameters
26 * ==========
27 *
28 * UPLO - CHARACTER*1.
29 * On entry, UPLO specifies whether the matrix is an upper or
30 * lower triangular matrix as follows:
31 *
32 * UPLO = 'U' or 'u' A is an upper triangular matrix.
33 *
34 * UPLO = 'L' or 'l' A is a lower triangular matrix.
35 *
36 * Unchanged on exit.
37 *
38 * TRANS - CHARACTER*1.
39 * On entry, TRANS specifies the equations to be solved as
40 * follows:
41 *
42 * TRANS = 'N' or 'n' A*x = b.
43 *
44 * TRANS = 'T' or 't' A'*x = b.
45 *
46 * TRANS = 'C' or 'c' A'*x = b.
47 *
48 * Unchanged on exit.
49 *
50 * DIAG - CHARACTER*1.
51 * On entry, DIAG specifies whether or not A is unit
52 * triangular as follows:
53 *
54 * DIAG = 'U' or 'u' A is assumed to be unit triangular.
55 *
56 * DIAG = 'N' or 'n' A is not assumed to be unit
57 * triangular.
58 *
59 * Unchanged on exit.
60 *
61 * N - INTEGER.
62 * On entry, N specifies the order of the matrix A.
63 * N must be at least zero.
64 * Unchanged on exit.
65 *
66 * A - DOUBLE PRECISION array of DIMENSION ( LDA, n ).
67 * Before entry with UPLO = 'U' or 'u', the leading n by n
68 * upper triangular part of the array A must contain the upper
69 * triangular matrix and the strictly lower triangular part of
70 * A is not referenced.
71 * Before entry with UPLO = 'L' or 'l', the leading n by n
72 * lower triangular part of the array A must contain the lower
73 * triangular matrix and the strictly upper triangular part of
74 * A is not referenced.
75 * Note that when DIAG = 'U' or 'u', the diagonal elements of
76 * A are not referenced either, but are assumed to be unity.
77 * Unchanged on exit.
78 *
79 * LDA - INTEGER.
80 * On entry, LDA specifies the first dimension of A as declared
81 * in the calling (sub) program. LDA must be at least
82 * max( 1, n ).
83 * Unchanged on exit.
84 *
85 * X - DOUBLE PRECISION array of dimension at least
86 * ( 1 + ( n - 1 )*abs( INCX ) ).
87 * Before entry, the incremented array X must contain the n
88 * element right-hand side vector b. On exit, X is overwritten
89 * with the solution vector x.
90 *
91 * INCX - INTEGER.
92 * On entry, INCX specifies the increment for the elements of
93 * X. INCX must not be zero.
94 * Unchanged on exit.
95 *
96 *
97 * Level 2 Blas routine.
98 *
99 * -- Written on 22-October-1986.
100 * Jack Dongarra, Argonne National Lab.
101 * Jeremy Du Croz, Nag Central Office.
102 * Sven Hammarling, Nag Central Office.
103 * Richard Hanson, Sandia National Labs.
104 *
105 *
106 * .. Parameters ..
107 DOUBLE PRECISION ZERO
108 PARAMETER ( ZERO = 0.0D+0 )
109 * .. Local Scalars ..
110 DOUBLE PRECISION TEMP
111 INTEGER I, INFO, IX, J, JX, KX
112 LOGICAL NOUNIT
113 * .. External Functions ..
114 LOGICAL LSAME
115 EXTERNAL LSAME
116 * .. External Subroutines ..
117 EXTERNAL XERBLA
118 * .. Intrinsic Functions ..
119 INTRINSIC MAX
120 * ..
121 * .. Executable Statements ..
122 *
123 * Test the input parameters.
124 *
125 INFO = 0
126 IF ( .NOT.LSAME( UPLO , 'U' ).AND.
127 $ .NOT.LSAME( UPLO , 'L' ) )THEN
128 INFO = 1
129 ELSE IF( .NOT.LSAME( TRANS, 'N' ).AND.
130 $ .NOT.LSAME( TRANS, 'T' ).AND.
131 $ .NOT.LSAME( TRANS, 'C' ) )THEN
132 INFO = 2
133 ELSE IF( .NOT.LSAME( DIAG , 'U' ).AND.
134 $ .NOT.LSAME( DIAG , 'N' ) )THEN
135 INFO = 3
136 ELSE IF( N.LT.0 )THEN
137 INFO = 4
138 ELSE IF( LDA.LT.MAX( 1, N ) )THEN
139 INFO = 6
140 ELSE IF( INCX.EQ.0 )THEN
141 INFO = 8
142 END IF
143 IF( INFO.NE.0 )THEN
144 CALL XERBLA( 'DTRSV ', INFO )
145 RETURN
146 END IF
147 *
148 * Quick return if possible.
149 *
150 IF( N.EQ.0 )
151 $ RETURN
152 *
153 NOUNIT = LSAME( DIAG, 'N' )
154 *
155 * Set up the start point in X if the increment is not unity. This
156 * will be ( N - 1 )*INCX too small for descending loops.
157 *
158 IF( INCX.LE.0 )THEN
159 KX = 1 - ( N - 1 )*INCX
160 ELSE IF( INCX.NE.1 )THEN
161 KX = 1
162 END IF
163 *
164 * Start the operations. In this version the elements of A are
165 * accessed sequentially with one pass through A.
166 *
167 IF( LSAME( TRANS, 'N' ) )THEN
168 *
169 * Form x := inv( A )*x.
170 *
171 IF( LSAME( UPLO, 'U' ) )THEN
172 IF( INCX.EQ.1 )THEN
173 DO 20, J = N, 1, -1
174 IF( X( J ).NE.ZERO )THEN
175 IF( NOUNIT )
176 $ X( J ) = X( J )/A( J, J )
177 TEMP = X( J )
178 DO 10, I = J - 1, 1, -1
179 X( I ) = X( I ) - TEMP*A( I, J )
180 10 CONTINUE
181 END IF
182 20 CONTINUE
183 ELSE
184 JX = KX + ( N - 1 )*INCX
185 DO 40, J = N, 1, -1
186 IF( X( JX ).NE.ZERO )THEN
187 IF( NOUNIT )
188 $ X( JX ) = X( JX )/A( J, J )
189 TEMP = X( JX )
190 IX = JX
191 DO 30, I = J - 1, 1, -1
192 IX = IX - INCX
193 X( IX ) = X( IX ) - TEMP*A( I, J )
194 30 CONTINUE
195 END IF
196 JX = JX - INCX
197 40 CONTINUE
198 END IF
199 ELSE
200 IF( INCX.EQ.1 )THEN
201 DO 60, J = 1, N
202 IF( X( J ).NE.ZERO )THEN
203 IF( NOUNIT )
204 $ X( J ) = X( J )/A( J, J )
205 TEMP = X( J )
206 DO 50, I = J + 1, N
207 X( I ) = X( I ) - TEMP*A( I, J )
208 50 CONTINUE
209 END IF
210 60 CONTINUE
211 ELSE
212 JX = KX
213 DO 80, J = 1, N
214 IF( X( JX ).NE.ZERO )THEN
215 IF( NOUNIT )
216 $ X( JX ) = X( JX )/A( J, J )
217 TEMP = X( JX )
218 IX = JX
219 DO 70, I = J + 1, N
220 IX = IX + INCX
221 X( IX ) = X( IX ) - TEMP*A( I, J )
222 70 CONTINUE
223 END IF
224 JX = JX + INCX
225 80 CONTINUE
226 END IF
227 END IF
228 ELSE
229 *
230 * Form x := inv( A' )*x.
231 *
232 IF( LSAME( UPLO, 'U' ) )THEN
233 IF( INCX.EQ.1 )THEN
234 DO 100, J = 1, N
235 TEMP = X( J )
236 DO 90, I = 1, J - 1
237 TEMP = TEMP - A( I, J )*X( I )
238 90 CONTINUE
239 IF( NOUNIT )
240 $ TEMP = TEMP/A( J, J )
241 X( J ) = TEMP
242 100 CONTINUE
243 ELSE
244 JX = KX
245 DO 120, J = 1, N
246 TEMP = X( JX )
247 IX = KX
248 DO 110, I = 1, J - 1
249 TEMP = TEMP - A( I, J )*X( IX )
250 IX = IX + INCX
251 110 CONTINUE
252 IF( NOUNIT )
253 $ TEMP = TEMP/A( J, J )
254 X( JX ) = TEMP
255 JX = JX + INCX
256 120 CONTINUE
257 END IF
258 ELSE
259 IF( INCX.EQ.1 )THEN
260 DO 140, J = N, 1, -1
261 TEMP = X( J )
262 DO 130, I = N, J + 1, -1
263 TEMP = TEMP - A( I, J )*X( I )
264 130 CONTINUE
265 IF( NOUNIT )
266 $ TEMP = TEMP/A( J, J )
267 X( J ) = TEMP
268 140 CONTINUE
269 ELSE
270 KX = KX + ( N - 1 )*INCX
271 JX = KX
272 DO 160, J = N, 1, -1
273 TEMP = X( JX )
274 IX = KX
275 DO 150, I = N, J + 1, -1
276 TEMP = TEMP - A( I, J )*X( IX )
277 IX = IX - INCX
278 150 CONTINUE
279 IF( NOUNIT )
280 $ TEMP = TEMP/A( J, J )
281 X( JX ) = TEMP
282 JX = JX - INCX
283 160 CONTINUE
284 END IF
285 END IF
286 END IF
287 *
288 RETURN
289 *
290 * End of DTRSV .
291 *
292 END

john.pye@anu.edu.au
ViewVC Help
Powered by ViewVC 1.1.22