00001
00002
00003
00004
00005
00006 #include "f2c.h"
00007 #include "cblasimpexp.h"
00008
00009
00010 int __IMPEXP__ dtrmm_(side, uplo, transa, diag, m, n, alpha, a, lda, b,
00011 ldb, side_len, uplo_len, transa_len, diag_len)
00012 char *side, *uplo, *transa, *diag;
00013 integer *m, *n;
00014 doublereal *alpha, *a;
00015 integer *lda;
00016 doublereal *b;
00017 integer *ldb;
00018 ftnlen side_len;
00019 ftnlen uplo_len;
00020 ftnlen transa_len;
00021 ftnlen diag_len;
00022 {
00023
00024 integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3;
00025
00026
00027 static integer info;
00028 static doublereal temp;
00029 static integer i, j, k;
00030 static logical lside;
00031 extern logical lsame_();
00032 static integer nrowa;
00033 static logical upper;
00034 extern int xerbla_();
00035 static logical nounit;
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201 a_dim1 = *lda;
00202 a_offset = a_dim1 + 1;
00203 a -= a_offset;
00204 b_dim1 = *ldb;
00205 b_offset = b_dim1 + 1;
00206 b -= b_offset;
00207
00208
00209 lside = lsame_(side, "L", 1L, 1L);
00210 if (lside) {
00211 nrowa = *m;
00212 } else {
00213 nrowa = *n;
00214 }
00215 nounit = lsame_(diag, "N", 1L, 1L);
00216 upper = lsame_(uplo, "U", 1L, 1L);
00217
00218 info = 0;
00219 if (! lside && ! lsame_(side, "R", 1L, 1L)) {
00220 info = 1;
00221 } else if (! upper && ! lsame_(uplo, "L", 1L, 1L)) {
00222 info = 2;
00223 } else if (! lsame_(transa, "N", 1L, 1L) && ! lsame_(transa, "T", 1L, 1L)
00224 && ! lsame_(transa, "C", 1L, 1L)) {
00225 info = 3;
00226 } else if (! lsame_(diag, "U", 1L, 1L) && ! lsame_(diag, "N", 1L, 1L)) {
00227 info = 4;
00228 } else if (*m < 0) {
00229 info = 5;
00230 } else if (*n < 0) {
00231 info = 6;
00232 } else if (*lda < max(1,nrowa)) {
00233 info = 9;
00234 } else if (*ldb < max(1,*m)) {
00235 info = 11;
00236 }
00237 if (info != 0) {
00238 xerbla_("DTRMM ", &info, 6L);
00239 return 0;
00240 }
00241
00242
00243
00244 if (*n == 0) {
00245 return 0;
00246 }
00247
00248
00249
00250 if (*alpha == 0.) {
00251 i__1 = *n;
00252 for (j = 1; j <= i__1; ++j) {
00253 i__2 = *m;
00254 for (i = 1; i <= i__2; ++i) {
00255 b[i + j * b_dim1] = 0.;
00256
00257 }
00258
00259 }
00260 return 0;
00261 }
00262
00263
00264
00265 if (lside) {
00266 if (lsame_(transa, "N", 1L, 1L)) {
00267
00268
00269
00270 if (upper) {
00271 i__1 = *n;
00272 for (j = 1; j <= i__1; ++j) {
00273 i__2 = *m;
00274 for (k = 1; k <= i__2; ++k) {
00275 if (b[k + j * b_dim1] != 0.) {
00276 temp = *alpha * b[k + j * b_dim1];
00277 i__3 = k - 1;
00278 for (i = 1; i <= i__3; ++i) {
00279 b[i + j * b_dim1] += temp * a[i + k * a_dim1];
00280
00281 }
00282 if (nounit) {
00283 temp *= a[k + k * a_dim1];
00284 }
00285 b[k + j * b_dim1] = temp;
00286 }
00287
00288 }
00289
00290 }
00291 } else {
00292 i__1 = *n;
00293 for (j = 1; j <= i__1; ++j) {
00294 for (k = *m; k >= 1; --k) {
00295 if (b[k + j * b_dim1] != 0.) {
00296 temp = *alpha * b[k + j * b_dim1];
00297 b[k + j * b_dim1] = temp;
00298 if (nounit) {
00299 b[k + j * b_dim1] *= a[k + k * a_dim1];
00300 }
00301 i__2 = *m;
00302 for (i = k + 1; i <= i__2; ++i) {
00303 b[i + j * b_dim1] += temp * a[i + k * a_dim1];
00304
00305 }
00306 }
00307
00308 }
00309
00310 }
00311 }
00312 } else {
00313
00314
00315
00316 if (upper) {
00317 i__1 = *n;
00318 for (j = 1; j <= i__1; ++j) {
00319 for (i = *m; i >= 1; --i) {
00320 temp = b[i + j * b_dim1];
00321 if (nounit) {
00322 temp *= a[i + i * a_dim1];
00323 }
00324 i__2 = i - 1;
00325 for (k = 1; k <= i__2; ++k) {
00326 temp += a[k + i * a_dim1] * b[k + j * b_dim1];
00327
00328 }
00329 b[i + j * b_dim1] = *alpha * temp;
00330
00331 }
00332
00333 }
00334 } else {
00335 i__1 = *n;
00336 for (j = 1; j <= i__1; ++j) {
00337 i__2 = *m;
00338 for (i = 1; i <= i__2; ++i) {
00339 temp = b[i + j * b_dim1];
00340 if (nounit) {
00341 temp *= a[i + i * a_dim1];
00342 }
00343 i__3 = *m;
00344 for (k = i + 1; k <= i__3; ++k) {
00345 temp += a[k + i * a_dim1] * b[k + j * b_dim1];
00346
00347 }
00348 b[i + j * b_dim1] = *alpha * temp;
00349
00350 }
00351
00352 }
00353 }
00354 }
00355 } else {
00356 if (lsame_(transa, "N", 1L, 1L)) {
00357
00358
00359
00360 if (upper) {
00361 for (j = *n; j >= 1; --j) {
00362 temp = *alpha;
00363 if (nounit) {
00364 temp *= a[j + j * a_dim1];
00365 }
00366 i__1 = *m;
00367 for (i = 1; i <= i__1; ++i) {
00368 b[i + j * b_dim1] = temp * b[i + j * b_dim1];
00369
00370 }
00371 i__1 = j - 1;
00372 for (k = 1; k <= i__1; ++k) {
00373 if (a[k + j * a_dim1] != 0.) {
00374 temp = *alpha * a[k + j * a_dim1];
00375 i__2 = *m;
00376 for (i = 1; i <= i__2; ++i) {
00377 b[i + j * b_dim1] += temp * b[i + k * b_dim1];
00378
00379 }
00380 }
00381
00382 }
00383
00384 }
00385 } else {
00386 i__1 = *n;
00387 for (j = 1; j <= i__1; ++j) {
00388 temp = *alpha;
00389 if (nounit) {
00390 temp *= a[j + j * a_dim1];
00391 }
00392 i__2 = *m;
00393 for (i = 1; i <= i__2; ++i) {
00394 b[i + j * b_dim1] = temp * b[i + j * b_dim1];
00395
00396 }
00397 i__2 = *n;
00398 for (k = j + 1; k <= i__2; ++k) {
00399 if (a[k + j * a_dim1] != 0.) {
00400 temp = *alpha * a[k + j * a_dim1];
00401 i__3 = *m;
00402 for (i = 1; i <= i__3; ++i) {
00403 b[i + j * b_dim1] += temp * b[i + k * b_dim1];
00404
00405 }
00406 }
00407
00408 }
00409
00410 }
00411 }
00412 } else {
00413
00414
00415
00416 if (upper) {
00417 i__1 = *n;
00418 for (k = 1; k <= i__1; ++k) {
00419 i__2 = k - 1;
00420 for (j = 1; j <= i__2; ++j) {
00421 if (a[j + k * a_dim1] != 0.) {
00422 temp = *alpha * a[j + k * a_dim1];
00423 i__3 = *m;
00424 for (i = 1; i <= i__3; ++i) {
00425 b[i + j * b_dim1] += temp * b[i + k * b_dim1];
00426
00427 }
00428 }
00429
00430 }
00431 temp = *alpha;
00432 if (nounit) {
00433 temp *= a[k + k * a_dim1];
00434 }
00435 if (temp != 1.) {
00436 i__2 = *m;
00437 for (i = 1; i <= i__2; ++i) {
00438 b[i + k * b_dim1] = temp * b[i + k * b_dim1];
00439
00440 }
00441 }
00442
00443 }
00444 } else {
00445 for (k = *n; k >= 1; --k) {
00446 i__1 = *n;
00447 for (j = k + 1; j <= i__1; ++j) {
00448 if (a[j + k * a_dim1] != 0.) {
00449 temp = *alpha * a[j + k * a_dim1];
00450 i__2 = *m;
00451 for (i = 1; i <= i__2; ++i) {
00452 b[i + j * b_dim1] += temp * b[i + k * b_dim1];
00453
00454 }
00455 }
00456
00457 }
00458 temp = *alpha;
00459 if (nounit) {
00460 temp *= a[k + k * a_dim1];
00461 }
00462 if (temp != 1.) {
00463 i__1 = *m;
00464 for (i = 1; i <= i__1; ++i) {
00465 b[i + k * b_dim1] = temp * b[i + k * b_dim1];
00466
00467 }
00468 }
00469
00470 }
00471 }
00472 }
00473 }
00474
00475 return 0;
00476
00477
00478
00479 }
00480