Chris@202
|
1 /* dtrsm.f -- translated by f2c (version 20061008).
|
Chris@202
|
2 You must link the resulting object file with libf2c:
|
Chris@202
|
3 on Microsoft Windows system, link with libf2c.lib;
|
Chris@202
|
4 on Linux or Unix systems, link with .../path/to/libf2c.a -lm
|
Chris@202
|
5 or, if you install libf2c.a in a standard place, with -lf2c -lm
|
Chris@202
|
6 -- in that order, at the end of the command line, as in
|
Chris@202
|
7 cc *.o -lf2c -lm
|
Chris@202
|
8 Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
|
Chris@202
|
9
|
Chris@202
|
10 http://www.netlib.org/f2c/libf2c.zip
|
Chris@202
|
11 */
|
Chris@202
|
12
|
Chris@202
|
13 #include "f2c.h"
|
Chris@202
|
14 #include "blaswrap.h"
|
Chris@202
|
15
|
Chris@202
|
16 /* Subroutine */ int dtrsm_(char *side, char *uplo, char *transa, char *diag,
|
Chris@202
|
17 integer *m, integer *n, doublereal *alpha, doublereal *a, integer *
|
Chris@202
|
18 lda, doublereal *b, integer *ldb)
|
Chris@202
|
19 {
|
Chris@202
|
20 /* System generated locals */
|
Chris@202
|
21 integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3;
|
Chris@202
|
22
|
Chris@202
|
23 /* Local variables */
|
Chris@202
|
24 integer i__, j, k, info;
|
Chris@202
|
25 doublereal temp;
|
Chris@202
|
26 logical lside;
|
Chris@202
|
27 extern logical lsame_(char *, char *);
|
Chris@202
|
28 integer nrowa;
|
Chris@202
|
29 logical upper;
|
Chris@202
|
30 extern /* Subroutine */ int xerbla_(char *, integer *);
|
Chris@202
|
31 logical nounit;
|
Chris@202
|
32
|
Chris@202
|
33 /* .. Scalar Arguments .. */
|
Chris@202
|
34 /* .. */
|
Chris@202
|
35 /* .. Array Arguments .. */
|
Chris@202
|
36 /* .. */
|
Chris@202
|
37
|
Chris@202
|
38 /* Purpose */
|
Chris@202
|
39 /* ======= */
|
Chris@202
|
40
|
Chris@202
|
41 /* DTRSM solves one of the matrix equations */
|
Chris@202
|
42
|
Chris@202
|
43 /* op( A )*X = alpha*B, or X*op( A ) = alpha*B, */
|
Chris@202
|
44
|
Chris@202
|
45 /* where alpha is a scalar, X and B are m by n matrices, A is a unit, or */
|
Chris@202
|
46 /* non-unit, upper or lower triangular matrix and op( A ) is one of */
|
Chris@202
|
47
|
Chris@202
|
48 /* op( A ) = A or op( A ) = A'. */
|
Chris@202
|
49
|
Chris@202
|
50 /* The matrix X is overwritten on B. */
|
Chris@202
|
51
|
Chris@202
|
52 /* Arguments */
|
Chris@202
|
53 /* ========== */
|
Chris@202
|
54
|
Chris@202
|
55 /* SIDE - CHARACTER*1. */
|
Chris@202
|
56 /* On entry, SIDE specifies whether op( A ) appears on the left */
|
Chris@202
|
57 /* or right of X as follows: */
|
Chris@202
|
58
|
Chris@202
|
59 /* SIDE = 'L' or 'l' op( A )*X = alpha*B. */
|
Chris@202
|
60
|
Chris@202
|
61 /* SIDE = 'R' or 'r' X*op( A ) = alpha*B. */
|
Chris@202
|
62
|
Chris@202
|
63 /* Unchanged on exit. */
|
Chris@202
|
64
|
Chris@202
|
65 /* UPLO - CHARACTER*1. */
|
Chris@202
|
66 /* On entry, UPLO specifies whether the matrix A is an upper or */
|
Chris@202
|
67 /* lower triangular matrix as follows: */
|
Chris@202
|
68
|
Chris@202
|
69 /* UPLO = 'U' or 'u' A is an upper triangular matrix. */
|
Chris@202
|
70
|
Chris@202
|
71 /* UPLO = 'L' or 'l' A is a lower triangular matrix. */
|
Chris@202
|
72
|
Chris@202
|
73 /* Unchanged on exit. */
|
Chris@202
|
74
|
Chris@202
|
75 /* TRANSA - CHARACTER*1. */
|
Chris@202
|
76 /* On entry, TRANSA specifies the form of op( A ) to be used in */
|
Chris@202
|
77 /* the matrix multiplication as follows: */
|
Chris@202
|
78
|
Chris@202
|
79 /* TRANSA = 'N' or 'n' op( A ) = A. */
|
Chris@202
|
80
|
Chris@202
|
81 /* TRANSA = 'T' or 't' op( A ) = A'. */
|
Chris@202
|
82
|
Chris@202
|
83 /* TRANSA = 'C' or 'c' op( A ) = A'. */
|
Chris@202
|
84
|
Chris@202
|
85 /* Unchanged on exit. */
|
Chris@202
|
86
|
Chris@202
|
87 /* DIAG - CHARACTER*1. */
|
Chris@202
|
88 /* On entry, DIAG specifies whether or not A is unit triangular */
|
Chris@202
|
89 /* as follows: */
|
Chris@202
|
90
|
Chris@202
|
91 /* DIAG = 'U' or 'u' A is assumed to be unit triangular. */
|
Chris@202
|
92
|
Chris@202
|
93 /* DIAG = 'N' or 'n' A is not assumed to be unit */
|
Chris@202
|
94 /* triangular. */
|
Chris@202
|
95
|
Chris@202
|
96 /* Unchanged on exit. */
|
Chris@202
|
97
|
Chris@202
|
98 /* M - INTEGER. */
|
Chris@202
|
99 /* On entry, M specifies the number of rows of B. M must be at */
|
Chris@202
|
100 /* least zero. */
|
Chris@202
|
101 /* Unchanged on exit. */
|
Chris@202
|
102
|
Chris@202
|
103 /* N - INTEGER. */
|
Chris@202
|
104 /* On entry, N specifies the number of columns of B. N must be */
|
Chris@202
|
105 /* at least zero. */
|
Chris@202
|
106 /* Unchanged on exit. */
|
Chris@202
|
107
|
Chris@202
|
108 /* ALPHA - DOUBLE PRECISION. */
|
Chris@202
|
109 /* On entry, ALPHA specifies the scalar alpha. When alpha is */
|
Chris@202
|
110 /* zero then A is not referenced and B need not be set before */
|
Chris@202
|
111 /* entry. */
|
Chris@202
|
112 /* Unchanged on exit. */
|
Chris@202
|
113
|
Chris@202
|
114 /* A - DOUBLE PRECISION array of DIMENSION ( LDA, k ), where k is m */
|
Chris@202
|
115 /* when SIDE = 'L' or 'l' and is n when SIDE = 'R' or 'r'. */
|
Chris@202
|
116 /* Before entry with UPLO = 'U' or 'u', the leading k by k */
|
Chris@202
|
117 /* upper triangular part of the array A must contain the upper */
|
Chris@202
|
118 /* triangular matrix and the strictly lower triangular part of */
|
Chris@202
|
119 /* A is not referenced. */
|
Chris@202
|
120 /* Before entry with UPLO = 'L' or 'l', the leading k by k */
|
Chris@202
|
121 /* lower triangular part of the array A must contain the lower */
|
Chris@202
|
122 /* triangular matrix and the strictly upper triangular part of */
|
Chris@202
|
123 /* A is not referenced. */
|
Chris@202
|
124 /* Note that when DIAG = 'U' or 'u', the diagonal elements of */
|
Chris@202
|
125 /* A are not referenced either, but are assumed to be unity. */
|
Chris@202
|
126 /* Unchanged on exit. */
|
Chris@202
|
127
|
Chris@202
|
128 /* LDA - INTEGER. */
|
Chris@202
|
129 /* On entry, LDA specifies the first dimension of A as declared */
|
Chris@202
|
130 /* in the calling (sub) program. When SIDE = 'L' or 'l' then */
|
Chris@202
|
131 /* LDA must be at least max( 1, m ), when SIDE = 'R' or 'r' */
|
Chris@202
|
132 /* then LDA must be at least max( 1, n ). */
|
Chris@202
|
133 /* Unchanged on exit. */
|
Chris@202
|
134
|
Chris@202
|
135 /* B - DOUBLE PRECISION array of DIMENSION ( LDB, n ). */
|
Chris@202
|
136 /* Before entry, the leading m by n part of the array B must */
|
Chris@202
|
137 /* contain the right-hand side matrix B, and on exit is */
|
Chris@202
|
138 /* overwritten by the solution matrix X. */
|
Chris@202
|
139
|
Chris@202
|
140 /* LDB - INTEGER. */
|
Chris@202
|
141 /* On entry, LDB specifies the first dimension of B as declared */
|
Chris@202
|
142 /* in the calling (sub) program. LDB must be at least */
|
Chris@202
|
143 /* max( 1, m ). */
|
Chris@202
|
144 /* Unchanged on exit. */
|
Chris@202
|
145
|
Chris@202
|
146
|
Chris@202
|
147 /* Level 3 Blas routine. */
|
Chris@202
|
148
|
Chris@202
|
149
|
Chris@202
|
150 /* -- Written on 8-February-1989. */
|
Chris@202
|
151 /* Jack Dongarra, Argonne National Laboratory. */
|
Chris@202
|
152 /* Iain Duff, AERE Harwell. */
|
Chris@202
|
153 /* Jeremy Du Croz, Numerical Algorithms Group Ltd. */
|
Chris@202
|
154 /* Sven Hammarling, Numerical Algorithms Group Ltd. */
|
Chris@202
|
155
|
Chris@202
|
156
|
Chris@202
|
157 /* .. External Functions .. */
|
Chris@202
|
158 /* .. */
|
Chris@202
|
159 /* .. External Subroutines .. */
|
Chris@202
|
160 /* .. */
|
Chris@202
|
161 /* .. Intrinsic Functions .. */
|
Chris@202
|
162 /* .. */
|
Chris@202
|
163 /* .. Local Scalars .. */
|
Chris@202
|
164 /* .. */
|
Chris@202
|
165 /* .. Parameters .. */
|
Chris@202
|
166 /* .. */
|
Chris@202
|
167
|
Chris@202
|
168 /* Test the input parameters. */
|
Chris@202
|
169
|
Chris@202
|
170 /* Parameter adjustments */
|
Chris@202
|
171 a_dim1 = *lda;
|
Chris@202
|
172 a_offset = 1 + a_dim1;
|
Chris@202
|
173 a -= a_offset;
|
Chris@202
|
174 b_dim1 = *ldb;
|
Chris@202
|
175 b_offset = 1 + b_dim1;
|
Chris@202
|
176 b -= b_offset;
|
Chris@202
|
177
|
Chris@202
|
178 /* Function Body */
|
Chris@202
|
179 lside = lsame_(side, "L");
|
Chris@202
|
180 if (lside) {
|
Chris@202
|
181 nrowa = *m;
|
Chris@202
|
182 } else {
|
Chris@202
|
183 nrowa = *n;
|
Chris@202
|
184 }
|
Chris@202
|
185 nounit = lsame_(diag, "N");
|
Chris@202
|
186 upper = lsame_(uplo, "U");
|
Chris@202
|
187
|
Chris@202
|
188 info = 0;
|
Chris@202
|
189 if (! lside && ! lsame_(side, "R")) {
|
Chris@202
|
190 info = 1;
|
Chris@202
|
191 } else if (! upper && ! lsame_(uplo, "L")) {
|
Chris@202
|
192 info = 2;
|
Chris@202
|
193 } else if (! lsame_(transa, "N") && ! lsame_(transa,
|
Chris@202
|
194 "T") && ! lsame_(transa, "C")) {
|
Chris@202
|
195 info = 3;
|
Chris@202
|
196 } else if (! lsame_(diag, "U") && ! lsame_(diag,
|
Chris@202
|
197 "N")) {
|
Chris@202
|
198 info = 4;
|
Chris@202
|
199 } else if (*m < 0) {
|
Chris@202
|
200 info = 5;
|
Chris@202
|
201 } else if (*n < 0) {
|
Chris@202
|
202 info = 6;
|
Chris@202
|
203 } else if (*lda < max(1,nrowa)) {
|
Chris@202
|
204 info = 9;
|
Chris@202
|
205 } else if (*ldb < max(1,*m)) {
|
Chris@202
|
206 info = 11;
|
Chris@202
|
207 }
|
Chris@202
|
208 if (info != 0) {
|
Chris@202
|
209 xerbla_("DTRSM ", &info);
|
Chris@202
|
210 return 0;
|
Chris@202
|
211 }
|
Chris@202
|
212
|
Chris@202
|
213 /* Quick return if possible. */
|
Chris@202
|
214
|
Chris@202
|
215 if (*m == 0 || *n == 0) {
|
Chris@202
|
216 return 0;
|
Chris@202
|
217 }
|
Chris@202
|
218
|
Chris@202
|
219 /* And when alpha.eq.zero. */
|
Chris@202
|
220
|
Chris@202
|
221 if (*alpha == 0.) {
|
Chris@202
|
222 i__1 = *n;
|
Chris@202
|
223 for (j = 1; j <= i__1; ++j) {
|
Chris@202
|
224 i__2 = *m;
|
Chris@202
|
225 for (i__ = 1; i__ <= i__2; ++i__) {
|
Chris@202
|
226 b[i__ + j * b_dim1] = 0.;
|
Chris@202
|
227 /* L10: */
|
Chris@202
|
228 }
|
Chris@202
|
229 /* L20: */
|
Chris@202
|
230 }
|
Chris@202
|
231 return 0;
|
Chris@202
|
232 }
|
Chris@202
|
233
|
Chris@202
|
234 /* Start the operations. */
|
Chris@202
|
235
|
Chris@202
|
236 if (lside) {
|
Chris@202
|
237 if (lsame_(transa, "N")) {
|
Chris@202
|
238
|
Chris@202
|
239 /* Form B := alpha*inv( A )*B. */
|
Chris@202
|
240
|
Chris@202
|
241 if (upper) {
|
Chris@202
|
242 i__1 = *n;
|
Chris@202
|
243 for (j = 1; j <= i__1; ++j) {
|
Chris@202
|
244 if (*alpha != 1.) {
|
Chris@202
|
245 i__2 = *m;
|
Chris@202
|
246 for (i__ = 1; i__ <= i__2; ++i__) {
|
Chris@202
|
247 b[i__ + j * b_dim1] = *alpha * b[i__ + j * b_dim1]
|
Chris@202
|
248 ;
|
Chris@202
|
249 /* L30: */
|
Chris@202
|
250 }
|
Chris@202
|
251 }
|
Chris@202
|
252 for (k = *m; k >= 1; --k) {
|
Chris@202
|
253 if (b[k + j * b_dim1] != 0.) {
|
Chris@202
|
254 if (nounit) {
|
Chris@202
|
255 b[k + j * b_dim1] /= a[k + k * a_dim1];
|
Chris@202
|
256 }
|
Chris@202
|
257 i__2 = k - 1;
|
Chris@202
|
258 for (i__ = 1; i__ <= i__2; ++i__) {
|
Chris@202
|
259 b[i__ + j * b_dim1] -= b[k + j * b_dim1] * a[
|
Chris@202
|
260 i__ + k * a_dim1];
|
Chris@202
|
261 /* L40: */
|
Chris@202
|
262 }
|
Chris@202
|
263 }
|
Chris@202
|
264 /* L50: */
|
Chris@202
|
265 }
|
Chris@202
|
266 /* L60: */
|
Chris@202
|
267 }
|
Chris@202
|
268 } else {
|
Chris@202
|
269 i__1 = *n;
|
Chris@202
|
270 for (j = 1; j <= i__1; ++j) {
|
Chris@202
|
271 if (*alpha != 1.) {
|
Chris@202
|
272 i__2 = *m;
|
Chris@202
|
273 for (i__ = 1; i__ <= i__2; ++i__) {
|
Chris@202
|
274 b[i__ + j * b_dim1] = *alpha * b[i__ + j * b_dim1]
|
Chris@202
|
275 ;
|
Chris@202
|
276 /* L70: */
|
Chris@202
|
277 }
|
Chris@202
|
278 }
|
Chris@202
|
279 i__2 = *m;
|
Chris@202
|
280 for (k = 1; k <= i__2; ++k) {
|
Chris@202
|
281 if (b[k + j * b_dim1] != 0.) {
|
Chris@202
|
282 if (nounit) {
|
Chris@202
|
283 b[k + j * b_dim1] /= a[k + k * a_dim1];
|
Chris@202
|
284 }
|
Chris@202
|
285 i__3 = *m;
|
Chris@202
|
286 for (i__ = k + 1; i__ <= i__3; ++i__) {
|
Chris@202
|
287 b[i__ + j * b_dim1] -= b[k + j * b_dim1] * a[
|
Chris@202
|
288 i__ + k * a_dim1];
|
Chris@202
|
289 /* L80: */
|
Chris@202
|
290 }
|
Chris@202
|
291 }
|
Chris@202
|
292 /* L90: */
|
Chris@202
|
293 }
|
Chris@202
|
294 /* L100: */
|
Chris@202
|
295 }
|
Chris@202
|
296 }
|
Chris@202
|
297 } else {
|
Chris@202
|
298
|
Chris@202
|
299 /* Form B := alpha*inv( A' )*B. */
|
Chris@202
|
300
|
Chris@202
|
301 if (upper) {
|
Chris@202
|
302 i__1 = *n;
|
Chris@202
|
303 for (j = 1; j <= i__1; ++j) {
|
Chris@202
|
304 i__2 = *m;
|
Chris@202
|
305 for (i__ = 1; i__ <= i__2; ++i__) {
|
Chris@202
|
306 temp = *alpha * b[i__ + j * b_dim1];
|
Chris@202
|
307 i__3 = i__ - 1;
|
Chris@202
|
308 for (k = 1; k <= i__3; ++k) {
|
Chris@202
|
309 temp -= a[k + i__ * a_dim1] * b[k + j * b_dim1];
|
Chris@202
|
310 /* L110: */
|
Chris@202
|
311 }
|
Chris@202
|
312 if (nounit) {
|
Chris@202
|
313 temp /= a[i__ + i__ * a_dim1];
|
Chris@202
|
314 }
|
Chris@202
|
315 b[i__ + j * b_dim1] = temp;
|
Chris@202
|
316 /* L120: */
|
Chris@202
|
317 }
|
Chris@202
|
318 /* L130: */
|
Chris@202
|
319 }
|
Chris@202
|
320 } else {
|
Chris@202
|
321 i__1 = *n;
|
Chris@202
|
322 for (j = 1; j <= i__1; ++j) {
|
Chris@202
|
323 for (i__ = *m; i__ >= 1; --i__) {
|
Chris@202
|
324 temp = *alpha * b[i__ + j * b_dim1];
|
Chris@202
|
325 i__2 = *m;
|
Chris@202
|
326 for (k = i__ + 1; k <= i__2; ++k) {
|
Chris@202
|
327 temp -= a[k + i__ * a_dim1] * b[k + j * b_dim1];
|
Chris@202
|
328 /* L140: */
|
Chris@202
|
329 }
|
Chris@202
|
330 if (nounit) {
|
Chris@202
|
331 temp /= a[i__ + i__ * a_dim1];
|
Chris@202
|
332 }
|
Chris@202
|
333 b[i__ + j * b_dim1] = temp;
|
Chris@202
|
334 /* L150: */
|
Chris@202
|
335 }
|
Chris@202
|
336 /* L160: */
|
Chris@202
|
337 }
|
Chris@202
|
338 }
|
Chris@202
|
339 }
|
Chris@202
|
340 } else {
|
Chris@202
|
341 if (lsame_(transa, "N")) {
|
Chris@202
|
342
|
Chris@202
|
343 /* Form B := alpha*B*inv( A ). */
|
Chris@202
|
344
|
Chris@202
|
345 if (upper) {
|
Chris@202
|
346 i__1 = *n;
|
Chris@202
|
347 for (j = 1; j <= i__1; ++j) {
|
Chris@202
|
348 if (*alpha != 1.) {
|
Chris@202
|
349 i__2 = *m;
|
Chris@202
|
350 for (i__ = 1; i__ <= i__2; ++i__) {
|
Chris@202
|
351 b[i__ + j * b_dim1] = *alpha * b[i__ + j * b_dim1]
|
Chris@202
|
352 ;
|
Chris@202
|
353 /* L170: */
|
Chris@202
|
354 }
|
Chris@202
|
355 }
|
Chris@202
|
356 i__2 = j - 1;
|
Chris@202
|
357 for (k = 1; k <= i__2; ++k) {
|
Chris@202
|
358 if (a[k + j * a_dim1] != 0.) {
|
Chris@202
|
359 i__3 = *m;
|
Chris@202
|
360 for (i__ = 1; i__ <= i__3; ++i__) {
|
Chris@202
|
361 b[i__ + j * b_dim1] -= a[k + j * a_dim1] * b[
|
Chris@202
|
362 i__ + k * b_dim1];
|
Chris@202
|
363 /* L180: */
|
Chris@202
|
364 }
|
Chris@202
|
365 }
|
Chris@202
|
366 /* L190: */
|
Chris@202
|
367 }
|
Chris@202
|
368 if (nounit) {
|
Chris@202
|
369 temp = 1. / a[j + j * a_dim1];
|
Chris@202
|
370 i__2 = *m;
|
Chris@202
|
371 for (i__ = 1; i__ <= i__2; ++i__) {
|
Chris@202
|
372 b[i__ + j * b_dim1] = temp * b[i__ + j * b_dim1];
|
Chris@202
|
373 /* L200: */
|
Chris@202
|
374 }
|
Chris@202
|
375 }
|
Chris@202
|
376 /* L210: */
|
Chris@202
|
377 }
|
Chris@202
|
378 } else {
|
Chris@202
|
379 for (j = *n; j >= 1; --j) {
|
Chris@202
|
380 if (*alpha != 1.) {
|
Chris@202
|
381 i__1 = *m;
|
Chris@202
|
382 for (i__ = 1; i__ <= i__1; ++i__) {
|
Chris@202
|
383 b[i__ + j * b_dim1] = *alpha * b[i__ + j * b_dim1]
|
Chris@202
|
384 ;
|
Chris@202
|
385 /* L220: */
|
Chris@202
|
386 }
|
Chris@202
|
387 }
|
Chris@202
|
388 i__1 = *n;
|
Chris@202
|
389 for (k = j + 1; k <= i__1; ++k) {
|
Chris@202
|
390 if (a[k + j * a_dim1] != 0.) {
|
Chris@202
|
391 i__2 = *m;
|
Chris@202
|
392 for (i__ = 1; i__ <= i__2; ++i__) {
|
Chris@202
|
393 b[i__ + j * b_dim1] -= a[k + j * a_dim1] * b[
|
Chris@202
|
394 i__ + k * b_dim1];
|
Chris@202
|
395 /* L230: */
|
Chris@202
|
396 }
|
Chris@202
|
397 }
|
Chris@202
|
398 /* L240: */
|
Chris@202
|
399 }
|
Chris@202
|
400 if (nounit) {
|
Chris@202
|
401 temp = 1. / a[j + j * a_dim1];
|
Chris@202
|
402 i__1 = *m;
|
Chris@202
|
403 for (i__ = 1; i__ <= i__1; ++i__) {
|
Chris@202
|
404 b[i__ + j * b_dim1] = temp * b[i__ + j * b_dim1];
|
Chris@202
|
405 /* L250: */
|
Chris@202
|
406 }
|
Chris@202
|
407 }
|
Chris@202
|
408 /* L260: */
|
Chris@202
|
409 }
|
Chris@202
|
410 }
|
Chris@202
|
411 } else {
|
Chris@202
|
412
|
Chris@202
|
413 /* Form B := alpha*B*inv( A' ). */
|
Chris@202
|
414
|
Chris@202
|
415 if (upper) {
|
Chris@202
|
416 for (k = *n; k >= 1; --k) {
|
Chris@202
|
417 if (nounit) {
|
Chris@202
|
418 temp = 1. / a[k + k * a_dim1];
|
Chris@202
|
419 i__1 = *m;
|
Chris@202
|
420 for (i__ = 1; i__ <= i__1; ++i__) {
|
Chris@202
|
421 b[i__ + k * b_dim1] = temp * b[i__ + k * b_dim1];
|
Chris@202
|
422 /* L270: */
|
Chris@202
|
423 }
|
Chris@202
|
424 }
|
Chris@202
|
425 i__1 = k - 1;
|
Chris@202
|
426 for (j = 1; j <= i__1; ++j) {
|
Chris@202
|
427 if (a[j + k * a_dim1] != 0.) {
|
Chris@202
|
428 temp = a[j + k * a_dim1];
|
Chris@202
|
429 i__2 = *m;
|
Chris@202
|
430 for (i__ = 1; i__ <= i__2; ++i__) {
|
Chris@202
|
431 b[i__ + j * b_dim1] -= temp * b[i__ + k *
|
Chris@202
|
432 b_dim1];
|
Chris@202
|
433 /* L280: */
|
Chris@202
|
434 }
|
Chris@202
|
435 }
|
Chris@202
|
436 /* L290: */
|
Chris@202
|
437 }
|
Chris@202
|
438 if (*alpha != 1.) {
|
Chris@202
|
439 i__1 = *m;
|
Chris@202
|
440 for (i__ = 1; i__ <= i__1; ++i__) {
|
Chris@202
|
441 b[i__ + k * b_dim1] = *alpha * b[i__ + k * b_dim1]
|
Chris@202
|
442 ;
|
Chris@202
|
443 /* L300: */
|
Chris@202
|
444 }
|
Chris@202
|
445 }
|
Chris@202
|
446 /* L310: */
|
Chris@202
|
447 }
|
Chris@202
|
448 } else {
|
Chris@202
|
449 i__1 = *n;
|
Chris@202
|
450 for (k = 1; k <= i__1; ++k) {
|
Chris@202
|
451 if (nounit) {
|
Chris@202
|
452 temp = 1. / a[k + k * a_dim1];
|
Chris@202
|
453 i__2 = *m;
|
Chris@202
|
454 for (i__ = 1; i__ <= i__2; ++i__) {
|
Chris@202
|
455 b[i__ + k * b_dim1] = temp * b[i__ + k * b_dim1];
|
Chris@202
|
456 /* L320: */
|
Chris@202
|
457 }
|
Chris@202
|
458 }
|
Chris@202
|
459 i__2 = *n;
|
Chris@202
|
460 for (j = k + 1; j <= i__2; ++j) {
|
Chris@202
|
461 if (a[j + k * a_dim1] != 0.) {
|
Chris@202
|
462 temp = a[j + k * a_dim1];
|
Chris@202
|
463 i__3 = *m;
|
Chris@202
|
464 for (i__ = 1; i__ <= i__3; ++i__) {
|
Chris@202
|
465 b[i__ + j * b_dim1] -= temp * b[i__ + k *
|
Chris@202
|
466 b_dim1];
|
Chris@202
|
467 /* L330: */
|
Chris@202
|
468 }
|
Chris@202
|
469 }
|
Chris@202
|
470 /* L340: */
|
Chris@202
|
471 }
|
Chris@202
|
472 if (*alpha != 1.) {
|
Chris@202
|
473 i__2 = *m;
|
Chris@202
|
474 for (i__ = 1; i__ <= i__2; ++i__) {
|
Chris@202
|
475 b[i__ + k * b_dim1] = *alpha * b[i__ + k * b_dim1]
|
Chris@202
|
476 ;
|
Chris@202
|
477 /* L350: */
|
Chris@202
|
478 }
|
Chris@202
|
479 }
|
Chris@202
|
480 /* L360: */
|
Chris@202
|
481 }
|
Chris@202
|
482 }
|
Chris@202
|
483 }
|
Chris@202
|
484 }
|
Chris@202
|
485
|
Chris@202
|
486 return 0;
|
Chris@202
|
487
|
Chris@202
|
488 /* End of DTRSM . */
|
Chris@202
|
489
|
Chris@202
|
490 } /* dtrsm_ */
|