4
* -- SuperLU routine (version 2.0) --
5
* Univ. of California Berkeley, Xerox Palo Alto Research Center,
6
* and Lawrence Berkeley National Lab.
11
* File name: smyblas2.c
13
* Level 2 BLAS operations: solves and matvec, written in C.
15
* This is only used when the system lacks an efficient BLAS library.
19
* Solves a dense UNIT lower triangular system. The unit lower
20
* triangular matrix is stored in a 2D array M(1:nrow,1:ncol).
21
* The solution will be returned in the rhs vector.
25
void slsolve ( int, int, float *, float *);
26
void susolve ( int, int, float *, float *);
27
void smatvec ( int, int, int, float *, float *, float *);
30
void slsolve ( int ldm, int ncol, float *M, float *rhs )
33
float x0, x1, x2, x3, x4, x5, x6, x7;
35
register float *Mki0, *Mki1, *Mki2, *Mki3, *Mki4, *Mki5, *Mki6, *Mki7;
36
register int firstcol = 0;
40
while ( firstcol < ncol - 7 ) { /* Do 8 columns */
42
Mki1 = Mki0 + ldm + 1;
43
Mki2 = Mki1 + ldm + 1;
44
Mki3 = Mki2 + ldm + 1;
45
Mki4 = Mki3 + ldm + 1;
46
Mki5 = Mki4 + ldm + 1;
47
Mki6 = Mki5 + ldm + 1;
48
Mki7 = Mki6 + ldm + 1;
51
x1 = rhs[firstcol+1] - x0 * *Mki0++;
52
x2 = rhs[firstcol+2] - x0 * *Mki0++ - x1 * *Mki1++;
53
x3 = rhs[firstcol+3] - x0 * *Mki0++ - x1 * *Mki1++ - x2 * *Mki2++;
54
x4 = rhs[firstcol+4] - x0 * *Mki0++ - x1 * *Mki1++ - x2 * *Mki2++
56
x5 = rhs[firstcol+5] - x0 * *Mki0++ - x1 * *Mki1++ - x2 * *Mki2++
57
- x3 * *Mki3++ - x4 * *Mki4++;
58
x6 = rhs[firstcol+6] - x0 * *Mki0++ - x1 * *Mki1++ - x2 * *Mki2++
59
- x3 * *Mki3++ - x4 * *Mki4++ - x5 * *Mki5++;
60
x7 = rhs[firstcol+7] - x0 * *Mki0++ - x1 * *Mki1++ - x2 * *Mki2++
61
- x3 * *Mki3++ - x4 * *Mki4++ - x5 * *Mki5++
73
for (k = firstcol; k < ncol; k++)
74
rhs[k] = rhs[k] - x0 * *Mki0++ - x1 * *Mki1++
75
- x2 * *Mki2++ - x3 * *Mki3++
76
- x4 * *Mki4++ - x5 * *Mki5++
77
- x6 * *Mki6++ - x7 * *Mki7++;
82
while ( firstcol < ncol - 3 ) { /* Do 4 columns */
84
Mki1 = Mki0 + ldm + 1;
85
Mki2 = Mki1 + ldm + 1;
86
Mki3 = Mki2 + ldm + 1;
89
x1 = rhs[firstcol+1] - x0 * *Mki0++;
90
x2 = rhs[firstcol+2] - x0 * *Mki0++ - x1 * *Mki1++;
91
x3 = rhs[firstcol+3] - x0 * *Mki0++ - x1 * *Mki1++ - x2 * *Mki2++;
98
for (k = firstcol; k < ncol; k++)
99
rhs[k] = rhs[k] - x0 * *Mki0++ - x1 * *Mki1++
100
- x2 * *Mki2++ - x3 * *Mki3++;
105
if ( firstcol < ncol - 1 ) { /* Do 2 columns */
107
Mki1 = Mki0 + ldm + 1;
110
x1 = rhs[firstcol+1] - x0 * *Mki0++;
112
rhs[++firstcol] = x1;
115
for (k = firstcol; k < ncol; k++)
116
rhs[k] = rhs[k] - x0 * *Mki0++ - x1 * *Mki1++;
123
* Solves a dense upper triangular system. The upper triangular matrix is
124
* stored in a 2-dim array M(1:ldm,1:ncol). The solution will be returned
128
susolve ( ldm, ncol, M, rhs )
132
float *rhs; /* modified */
139
for (j = 0; j < ncol; j++) {
141
xj = rhs[jcol] / M[jcol + jcol*ldm]; /* M(jcol, jcol) */
144
for (irow = 0; irow < jcol; irow++)
145
rhs[irow] -= xj * M[irow + jcol*ldm]; /* M(irow, jcol) */
154
* Performs a dense matrix-vector multiply: Mxvec = Mxvec + M * vec.
155
* The input matrix is M(1:nrow,1:ncol); The product is returned in Mxvec[].
157
void smatvec ( ldm, nrow, ncol, M, vec, Mxvec )
159
int ldm; /* in -- leading dimension of M */
164
float *Mxvec; /* in/out */
167
float vi0, vi1, vi2, vi3, vi4, vi5, vi6, vi7;
169
register float *Mki0, *Mki1, *Mki2, *Mki3, *Mki4, *Mki5, *Mki6, *Mki7;
170
register int firstcol = 0;
174
while ( firstcol < ncol - 7 ) { /* Do 8 columns */
185
vi0 = vec[firstcol++];
186
vi1 = vec[firstcol++];
187
vi2 = vec[firstcol++];
188
vi3 = vec[firstcol++];
189
vi4 = vec[firstcol++];
190
vi5 = vec[firstcol++];
191
vi6 = vec[firstcol++];
192
vi7 = vec[firstcol++];
194
for (k = 0; k < nrow; k++)
195
Mxvec[k] += vi0 * *Mki0++ + vi1 * *Mki1++
196
+ vi2 * *Mki2++ + vi3 * *Mki3++
197
+ vi4 * *Mki4++ + vi5 * *Mki5++
198
+ vi6 * *Mki6++ + vi7 * *Mki7++;
203
while ( firstcol < ncol - 3 ) { /* Do 4 columns */
210
vi0 = vec[firstcol++];
211
vi1 = vec[firstcol++];
212
vi2 = vec[firstcol++];
213
vi3 = vec[firstcol++];
214
for (k = 0; k < nrow; k++)
215
Mxvec[k] += vi0 * *Mki0++ + vi1 * *Mki1++
216
+ vi2 * *Mki2++ + vi3 * *Mki3++ ;
221
while ( firstcol < ncol ) { /* Do 1 column */
224
vi0 = vec[firstcol++];
225
for (k = 0; k < nrow; k++)
226
Mxvec[k] += vi0 * *Mki0++;