annotate ext/cblas/src/dtrsm.c @ 482:cbe668c7d724

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