annotate ext/cblas/src/dtrsm.c @ 211:a41bea655151 msvc

Rename FFT back again, now we have our own project
author Chris Cannam
date Mon, 05 Feb 2018 17:40:13 +0000
parents 45330e0d2819
children
rev   line source
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_ */