annotate ext/cblas/src/dtrsm.c @ 209:ccd2019190bf msvc

Some MSVC fixes, including (temporarily, probably) renaming the FFT source file to avoid getting it mixed up with the Vamp SDK one in our object dir
author Chris Cannam
date Thu, 01 Feb 2018 16:34:08 +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_ */