1 /* blas/source_trsm_r.h
3 * Copyright (C) 2001, 2007 Brian Gough
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 3 of the License, or (at
8 * your option) any later version.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
23 const int nonunit = (Diag == CblasNonUnit);
24 int side, uplo, trans;
26 if (Order == CblasRowMajor) {
31 trans = (TransA == CblasConjTrans) ? CblasTrans : TransA;
35 side = (Side == CblasLeft) ? CblasRight : CblasLeft;
36 uplo = (Uplo == CblasUpper) ? CblasLower : CblasUpper;
37 trans = (TransA == CblasConjTrans) ? CblasTrans : TransA;
40 if (side == CblasLeft && uplo == CblasUpper && trans == CblasNoTrans) {
42 /* form B := alpha * inv(TriU(A)) *B */
45 for (i = 0; i < n1; i++) {
46 for (j = 0; j < n2; j++) {
47 B[ldb * i + j] *= alpha;
52 for (i = n1; i > 0 && i--;) {
54 BASE Aii = A[lda * i + i];
55 for (j = 0; j < n2; j++) {
56 B[ldb * i + j] /= Aii;
60 for (k = 0; k < i; k++) {
61 const BASE Aki = A[k * lda + i];
62 for (j = 0; j < n2; j++) {
63 B[ldb * k + j] -= Aki * B[ldb * i + j];
68 } else if (side == CblasLeft && uplo == CblasUpper && trans == CblasTrans) {
70 /* form B := alpha * inv(TriU(A))' *B */
73 for (i = 0; i < n1; i++) {
74 for (j = 0; j < n2; j++) {
75 B[ldb * i + j] *= alpha;
80 for (i = 0; i < n1; i++) {
82 BASE Aii = A[lda * i + i];
83 for (j = 0; j < n2; j++) {
84 B[ldb * i + j] /= Aii;
88 for (k = i + 1; k < n1; k++) {
89 const BASE Aik = A[i * lda + k];
90 for (j = 0; j < n2; j++) {
91 B[ldb * k + j] -= Aik * B[ldb * i + j];
96 } else if (side == CblasLeft && uplo == CblasLower && trans == CblasNoTrans) {
98 /* form B := alpha * inv(TriL(A))*B */
102 for (i = 0; i < n1; i++) {
103 for (j = 0; j < n2; j++) {
104 B[ldb * i + j] *= alpha;
109 for (i = 0; i < n1; i++) {
111 BASE Aii = A[lda * i + i];
112 for (j = 0; j < n2; j++) {
113 B[ldb * i + j] /= Aii;
117 for (k = i + 1; k < n1; k++) {
118 const BASE Aki = A[k * lda + i];
119 for (j = 0; j < n2; j++) {
120 B[ldb * k + j] -= Aki * B[ldb * i + j];
126 } else if (side == CblasLeft && uplo == CblasLower && trans == CblasTrans) {
128 /* form B := alpha * TriL(A)' *B */
131 for (i = 0; i < n1; i++) {
132 for (j = 0; j < n2; j++) {
133 B[ldb * i + j] *= alpha;
138 for (i = n1; i > 0 && i--;) {
140 BASE Aii = A[lda * i + i];
141 for (j = 0; j < n2; j++) {
142 B[ldb * i + j] /= Aii;
146 for (k = 0; k < i; k++) {
147 const BASE Aik = A[i * lda + k];
148 for (j = 0; j < n2; j++) {
149 B[ldb * k + j] -= Aik * B[ldb * i + j];
154 } else if (side == CblasRight && uplo == CblasUpper && trans == CblasNoTrans) {
156 /* form B := alpha * B * inv(TriU(A)) */
159 for (i = 0; i < n1; i++) {
160 for (j = 0; j < n2; j++) {
161 B[ldb * i + j] *= alpha;
166 for (i = 0; i < n1; i++) {
167 for (j = 0; j < n2; j++) {
169 BASE Ajj = A[lda * j + j];
170 B[ldb * i + j] /= Ajj;
174 BASE Bij = B[ldb * i + j];
175 for (k = j + 1; k < n2; k++) {
176 B[ldb * i + k] -= A[j * lda + k] * Bij;
182 } else if (side == CblasRight && uplo == CblasUpper && trans == CblasTrans) {
184 /* form B := alpha * B * inv(TriU(A))' */
187 for (i = 0; i < n1; i++) {
188 for (j = 0; j < n2; j++) {
189 B[ldb * i + j] *= alpha;
194 for (i = 0; i < n1; i++) {
195 for (j = n2; j > 0 && j--;) {
198 BASE Ajj = A[lda * j + j];
199 B[ldb * i + j] /= Ajj;
203 BASE Bij = B[ldb * i + j];
204 for (k = 0; k < j; k++) {
205 B[ldb * i + k] -= A[k * lda + j] * Bij;
212 } else if (side == CblasRight && uplo == CblasLower && trans == CblasNoTrans) {
214 /* form B := alpha * B * inv(TriL(A)) */
217 for (i = 0; i < n1; i++) {
218 for (j = 0; j < n2; j++) {
219 B[ldb * i + j] *= alpha;
224 for (i = 0; i < n1; i++) {
225 for (j = n2; j > 0 && j--;) {
228 BASE Ajj = A[lda * j + j];
229 B[ldb * i + j] /= Ajj;
233 BASE Bij = B[ldb * i + j];
234 for (k = 0; k < j; k++) {
235 B[ldb * i + k] -= A[j * lda + k] * Bij;
241 } else if (side == CblasRight && uplo == CblasLower && trans == CblasTrans) {
243 /* form B := alpha * B * inv(TriL(A))' */
247 for (i = 0; i < n1; i++) {
248 for (j = 0; j < n2; j++) {
249 B[ldb * i + j] *= alpha;
254 for (i = 0; i < n1; i++) {
255 for (j = 0; j < n2; j++) {
257 BASE Ajj = A[lda * j + j];
258 B[ldb * i + j] /= Ajj;
262 BASE Bij = B[ldb * i + j];
263 for (k = j + 1; k < n2; k++) {
264 B[ldb * i + k] -= A[k * lda + j] * Bij;
273 BLAS_ERROR("unrecognized operation");