22#include "fasp_functs.h"
44 for (i = 0; i < A->
col; ++i) {
48 for (sweep_now = 0; sweep_now < nsweeps; ++sweep_now) {
49 for (i = 0; i < A->
row; ++i) {
50 if (ordering[i] ==
FGPT) {
53 INT row_start = A->
IA[i];
54 INT row_end = A->
IA[i + 1];
55 for (j = row_start; j < row_end; ++j) {
58 if (k == i) diagptr = j;
59 r[i] -= A->
val[j] * x->
val[k];
62 xval[i] += relax * r[i] / A->
val[diagptr];
65 for (i = 0; i < A->
col; ++i) {
66 if (ordering[i] ==
FGPT) {
106 const INT N =
ABS(i_n - i_1) + 1;
107 const INT * ia = A->
IA, *ja = A->
JA;
112 INT i, j, k, begin_row, end_row;
116 INT myid, mybegin, myend;
117 INT nthreads = fasp_get_num_threads();
128#pragma omp parallel for private(myid, mybegin, myend, begin_row, end_row, i, k, j)
129 for (myid = 0; myid < nthreads; ++myid) {
133 for (i = mybegin; i < myend; i += s) {
135 begin_row = ia[i], end_row = ia[i + 1];
136 for (k = begin_row; k < end_row; ++k) {
139 t[i] -= aval[k] * uval[j];
147 for (i = i_1; i <= i_n; i += s) {
151 for (k = begin_row; k < end_row; ++k) {
154 t[i] -= aval[k] * uval[j];
164#pragma omp parallel for private(i)
166 for (i = i_1; i <= i_n; i += s) {
168 uval[i] = (1 - w) * uval[i] + w * t[i] / d[i];
177#pragma omp parallel for private(myid, mybegin, myend, i, begin_row, end_row, k, j)
178 for (myid = 0; myid < nthreads; myid++) {
180 mybegin = i_1 - mybegin;
182 for (i = mybegin; i > myend; i += s) {
184 begin_row = ia[i], end_row = ia[i + 1];
185 for (k = begin_row; k < end_row; ++k) {
188 t[i] -= aval[k] * uval[j];
196 for (i = i_1; i >= i_n; i += s) {
200 for (k = begin_row; k < end_row; ++k) {
203 t[i] -= aval[k] * uval[j];
213#pragma omp parallel for private(i)
215 for (i = i_1; i >= i_n; i += s) {
217 uval[i] = (1 - w) * uval[i] + w * t[i] / d[i];
258 const INT * ia = A->
IA, *ja = A->
JA;
263 INT i, j, k, begin_row, end_row;
267 const INT N =
ABS(i_n - i_1) + 1;
268 INT myid, mybegin, myend;
269 INT nthreads = fasp_get_num_threads();
277#pragma omp parallel for private(myid, mybegin, myend, i, t, begin_row, end_row, d, k, \
279 for (myid = 0; myid < nthreads; myid++) {
281 mybegin += i_1, myend += i_1;
282 for (i = mybegin; i < myend; i += s) {
284 begin_row = ia[i], end_row = ia[i + 1];
288 for (k = begin_row + 1; k < end_row; ++k) {
290 t -= aval[k] * uval[j];
295 for (k = begin_row; k < end_row; ++k) {
298 t -= aval[k] * uval[j];
311 for (i = i_1; i <= i_n; i += s) {
319 for (k = begin_row + 1; k < end_row; ++k) {
321 t -= aval[k] * uval[j];
326 for (k = begin_row; k < end_row; ++k) {
329 t -= aval[k] * uval[j];
347#pragma omp parallel for private(myid, mybegin, myend, i, begin_row, end_row, d, k, j, \
349 for (myid = 0; myid < nthreads; myid++) {
351 mybegin = i_1 - mybegin;
353 for (i = mybegin; i > myend; i += s) {
355 begin_row = ia[i], end_row = ia[i + 1];
359 for (k = begin_row + 1; k < end_row; ++k) {
361 t -= aval[k] * uval[j];
366 for (k = begin_row; k < end_row; ++k) {
369 t -= aval[k] * uval[j];
379 for (i = i_1; i >= i_n; i += s) {
386 for (k = begin_row + 1; k < end_row; ++k) {
388 t -= aval[k] * uval[j];
393 for (k = begin_row; k < end_row; ++k) {
396 t -= aval[k] * uval[j];
435 const INT * ia = A->
IA, *ja = A->
JA;
439 INT i, j, k, begin_row, end_row;
443 INT myid, mybegin, myend;
444 INT nthreads = fasp_get_num_threads();
454#pragma omp parallel for private(myid, mybegin, myend, i, t, begin_row, end_row, k, j, \
456 for (myid = 0; myid < nthreads; myid++) {
458 for (i = mybegin; i < myend; i++) {
461 begin_row = ia[i], end_row = ia[i + 1];
464 for (k = begin_row + 1; k < end_row; k++) {
466 t -= aval[k] * uval[j];
469 for (k = begin_row; k < end_row; k++) {
472 t -= aval[k] * uval[j];
483 for (i = 0; i < nrow; i++) {
490 for (k = begin_row + 1; k < end_row; k++) {
492 t -= aval[k] * uval[j];
495 for (k = begin_row; k < end_row; k++) {
498 t -= aval[k] * uval[j];
512#pragma omp parallel for private(myid, mybegin, myend, i, t, begin_row, end_row, k, j, \
514 for (myid = 0; myid < nthreads; myid++) {
516 for (i = mybegin; i < myend; i++) {
519 begin_row = ia[i], end_row = ia[i + 1];
522 for (k = begin_row + 1; k < end_row; k++) {
524 t -= aval[k] * uval[j];
527 for (k = begin_row; k < end_row; k++) {
530 t -= aval[k] * uval[j];
541 for (i = 0; i < nrow; i++) {
548 for (k = begin_row + 1; k < end_row; k++) {
550 t -= aval[k] * uval[j];
553 for (k = begin_row; k < end_row; k++) {
556 t -= aval[k] * uval[j];
577#pragma omp parallel for private(myid, mybegin, myend, t, i, begin_row, end_row, k, j, \
579 for (myid = 0; myid < nthreads; myid++) {
581 for (i = mybegin; i < myend; i++) {
584 begin_row = ia[i], end_row = ia[i + 1];
587 for (k = begin_row + 1; k < end_row; k++) {
589 t -= aval[k] * uval[j];
592 for (k = begin_row; k < end_row; k++) {
595 t -= aval[k] * uval[j];
606 for (i = 0; i < nrow; i++) {
613 for (k = begin_row + 1; k < end_row; k++) {
615 t -= aval[k] * uval[j];
618 for (k = begin_row; k < end_row; k++) {
621 t -= aval[k] * uval[j];
635#pragma omp parallel for private(myid, mybegin, myend, i, t, begin_row, end_row, k, j, \
637 for (myid = 0; myid < nthreads; myid++) {
639 for (i = mybegin; i < myend; i++) {
642 begin_row = ia[i], end_row = ia[i + 1];
645 for (k = begin_row + 1; k < end_row; k++) {
647 t -= aval[k] * uval[j];
650 for (k = begin_row; k < end_row; k++) {
653 t -= aval[k] * uval[j];
664 for (i = 0; i < nrow; i++) {
671 for (k = begin_row + 1; k < end_row; k++) {
673 t -= aval[k] * uval[j];
676 for (k = begin_row; k < end_row; k++) {
679 t -= aval[k] * uval[j];
715 const INT * ia = A->
IA, *ja = A->
JA;
719 INT i, j, k, begin_row, end_row;
723 INT myid, mybegin, myend;
724 INT nthreads = fasp_get_num_threads();
731#pragma omp parallel for private(myid, mybegin, myend, i, t, begin_row, end_row, k, j, \
733 for (myid = 0; myid < nthreads; myid++) {
735 for (i = mybegin; i < myend; i++) {
738 begin_row = ia[i], end_row = ia[i + 1];
741 for (k = begin_row + 1; k < end_row; k++) {
743 t -= aval[k] * uval[j];
746 for (k = begin_row; k < end_row; k++) {
749 t -= aval[k] * uval[j];
760 for (i = 0; i < nrow; i++) {
767 for (k = begin_row + 1; k < end_row; k++) {
769 t -= aval[k] * uval[j];
772 for (k = begin_row; k < end_row; k++) {
775 t -= aval[k] * uval[j];
809 const INT nm1 = b->
row - 1;
810 const INT * ia = A->
IA, *ja = A->
JA;
815 INT i, j, k, begin_row, end_row;
819 INT myid, mybegin, myend, up;
820 INT nthreads = fasp_get_num_threads();
828#pragma omp parallel for private(myid, mybegin, myend, i, t, begin_row, end_row, j, k, \
830 for (myid = 0; myid < nthreads; myid++) {
832 for (i = mybegin; i < myend; i++) {
834 begin_row = ia[i], end_row = ia[i + 1];
835 for (k = begin_row; k < end_row; ++k) {
838 t -= aval[k] * uval[j];
847 for (i = 0; i <= nm1; ++i) {
851 for (k = begin_row; k < end_row; ++k) {
854 t -= aval[k] * uval[j];
868#pragma omp parallel for private(myid, mybegin, myend, i, t, begin_row, end_row, k, j, \
870 for (myid = 0; myid < nthreads; myid++) {
872 mybegin = nm1 - 1 - mybegin;
873 myend = nm1 - 1 - myend;
874 for (i = mybegin; i > myend; i--) {
876 begin_row = ia[i], end_row = ia[i + 1];
877 for (k = begin_row; k < end_row; k++) {
880 t -= aval[k] * uval[j];
889 for (i = nm1 - 1; i >= 0; --i) {
893 for (k = begin_row; k < end_row; ++k) {
896 t -= aval[k] * uval[j];
940 const INT * ia = A->
IA, *ja = A->
JA;
945 INT i, j, k, begin_row, end_row;
949 const INT N =
ABS(i_n - i_1) + 1;
950 INT myid, mybegin, myend;
951 INT nthreads = fasp_get_num_threads();
958#pragma omp parallel for private(myid, mybegin, myend, i, t, begin_row, end_row, k, j, \
960 for (myid = 0; myid < nthreads; myid++) {
962 mybegin += i_1, myend += i_1;
963 for (i = mybegin; i < myend; i += s) {
965 begin_row = ia[i], end_row = ia[i + 1];
966 for (k = begin_row; k < end_row; k++) {
969 t -= aval[k] * uval[j];
974 uval[i] = w * (t / d) + (1 - w) * uval[i];
980 for (i = i_1; i <= i_n; i += s) {
984 for (k = begin_row; k < end_row; ++k) {
987 t -= aval[k] * uval[j];
991 if (
ABS(d) >
SMALLREAL) uval[i] = w * (t / d) + (1 - w) * uval[i];
999#pragma omp parallel for private(myid, mybegin, myend, i, t, begin_row, end_row, k, j, \
1001 for (myid = 0; myid < nthreads; myid++) {
1003 mybegin = i_1 - mybegin, myend = i_1 - myend;
1004 for (i = mybegin; i > myend; i += s) {
1006 begin_row = ia[i], end_row = ia[i + 1];
1007 for (k = begin_row; k < end_row; ++k) {
1010 t -= aval[k] * uval[j];
1015 uval[i] = w * (t / d) + (1 - w) * uval[i];
1020 for (i = i_1; i >= i_n; i += s) {
1023 end_row = ia[i + 1];
1024 for (k = begin_row; k < end_row; ++k) {
1027 t -= aval[k] * uval[j];
1031 if (
ABS(d) >
SMALLREAL) uval[i] = w * (t / d) + (1 - w) * uval[i];
1065 const INT * ia = A->
IA, *ja = A->
JA;
1070 INT i, j, k, begin_row, end_row;
1074 INT myid, mybegin, myend;
1075 INT nthreads = fasp_get_num_threads();
1083#pragma omp parallel for private(myid, mybegin, myend, i, t, begin_row, end_row, k, j, \
1085 for (myid = 0; myid < nthreads; myid++) {
1087 for (i = mybegin; i < myend; i++) {
1088 if (mark[i] == 0 || mark[i] == 2) {
1090 begin_row = ia[i], end_row = ia[i + 1];
1091 for (k = begin_row; k < end_row; k++) {
1094 t -= aval[k] * uval[j];
1099 uval[i] = w * (t / d) + (1 - w) * uval[i];
1106 for (i = 0; i < nrow; i++) {
1107 if (mark[i] == 0 || mark[i] == 2) {
1110 end_row = ia[i + 1];
1111 for (k = begin_row; k < end_row; k++) {
1114 t -= aval[k] * uval[j];
1119 uval[i] = w * (t / d) + (1 - w) * uval[i];
1128#pragma omp parallel for private(myid, i, mybegin, myend, t, begin_row, end_row, k, j, \
1130 for (myid = 0; myid < nthreads; myid++) {
1132 for (i = mybegin; i < myend; i++) {
1135 begin_row = ia[i], end_row = ia[i + 1];
1136 for (k = begin_row; k < end_row; k++) {
1139 t -= aval[k] * uval[j];
1144 uval[i] = w * (t / d) + (1 - w) * uval[i];
1150 for (i = 0; i < nrow; i++) {
1154 end_row = ia[i + 1];
1155 for (k = begin_row; k < end_row; k++) {
1158 t -= aval[k] * uval[j];
1163 uval[i] = w * (t / d) + (1 - w) * uval[i];
1174#pragma omp parallel for private(myid, mybegin, myend, i, t, k, j, d, begin_row, \
1176 for (myid = 0; myid < nthreads; myid++) {
1178 for (i = mybegin; i < myend; i++) {
1181 begin_row = ia[i], end_row = ia[i + 1];
1182 for (k = begin_row; k < end_row; k++) {
1185 t -= aval[k] * uval[j];
1190 uval[i] = w * (t / d) + (1 - w) * uval[i];
1196 for (i = 0; i < nrow; i++) {
1200 end_row = ia[i + 1];
1201 for (k = begin_row; k < end_row; k++) {
1204 t -= aval[k] * uval[j];
1209 uval[i] = w * (t / d) + (1 - w) * uval[i];
1218#pragma omp parallel for private(myid, mybegin, myend, i, t, begin_row, end_row, k, j, \
1220 for (myid = 0; myid < nthreads; myid++) {
1222 for (i = mybegin; i < myend; i++) {
1225 begin_row = ia[i], end_row = ia[i + 1];
1226 for (k = begin_row; k < end_row; k++) {
1229 t -= aval[k] * uval[j];
1234 uval[i] = w * (t / d) + (1 - w) * uval[i];
1241 for (i = 0; i < nrow; i++) {
1245 end_row = ia[i + 1];
1246 for (k = begin_row; k < end_row; k++) {
1249 t -= aval[k] * uval[j];
1254 uval[i] = w * (t / d) + (1 - w) * uval[i];
1281 const INT m = A->
row, m2 = 2 * m, memneed = 3 * m;
1288 if (iludata->
nwork < memneed)
goto MEMERR;
1291 INT i, j, jj, begin_row, end_row;
1302 for (i = 1; i < m; ++i) {
1303 begin_row = ijlu[i];
1304 end_row = ijlu[i + 1];
1305 for (j = begin_row; j < end_row; ++j) {
1308 zr[i] -= lu[j] * zz[jj];
1316 z[m - 1] = zz[m - 1] * lu[m - 1];
1317 for (i = m - 2; i >= 0; --i) {
1318 begin_row = ijlu[i];
1319 end_row = ijlu[i + 1] - 1;
1320 for (j = end_row; j >= begin_row; --j) {
1323 zz[i] -= lu[j] * z[jj];
1327 z[i] = zz[i] * lu[i];
1336 printf(
"### ERROR: ILU needs %d memory, only %d available! [%s:%d]\n", memneed,
1337 iludata->
nwork, __FILE__, __LINE__);
1371 const INT * ia = A->
IA, *ja = A->
JA;
1376 INT i, j, k, begin_row, end_row;
1377 REAL temp1, temp2, alpha;
1380 const INT N =
ABS(i_n - i_1) + 1;
1381 INT myid, mybegin, myend;
1382 INT nthreads = fasp_get_num_threads();
1390#pragma omp parallel for private(myid, mybegin, myend, i, temp1, temp2, begin_row, \
1391 end_row, k, alpha, j)
1392 for (myid = 0; myid < nthreads; myid++) {
1394 mybegin += i_1, myend += i_1;
1395 for (i = mybegin; i < myend; i += s) {
1398 begin_row = ia[i], end_row = ia[i + 1];
1399 for (k = begin_row; k < end_row; k++) {
1401 temp1 += aval[k] * aval[k];
1402 temp2 += aval[k] * uval[j];
1405 alpha = (bval[i] - temp2) / temp1;
1406 for (k = begin_row; k < end_row; ++k) {
1408 uval[j] += w * alpha * aval[k];
1413 for (i = i_1; i <= i_n; i += s) {
1417 end_row = ia[i + 1];
1418 for (k = begin_row; k < end_row; ++k) {
1420 temp1 += aval[k] * aval[k];
1421 temp2 += aval[k] * uval[j];
1423 alpha = (bval[i] - temp2) / temp1;
1424 for (k = begin_row; k < end_row; ++k) {
1426 uval[j] += w * alpha * aval[k];
1440#pragma omp parallel for private(myid, mybegin, myend, i, temp1, temp2, begin_row, \
1441 end_row, k, alpha, j)
1442 for (myid = 0; myid < nthreads; myid++) {
1444 mybegin = i_1 - mybegin, myend = i_1 - myend;
1445 for (i = mybegin; i > myend; i += s) {
1448 begin_row = ia[i], end_row = ia[i + 1];
1449 for (k = begin_row; k < end_row; ++k) {
1451 temp1 += aval[k] * aval[k];
1452 temp2 += aval[k] * uval[j];
1454 alpha = (bval[i] - temp2) / temp1;
1455 for (k = begin_row; k < end_row; ++k) {
1457 uval[j] += w * alpha * aval[k];
1463 for (i = i_1; i >= i_n; i += s) {
1467 end_row = ia[i + 1];
1468 for (k = begin_row; k < end_row; ++k) {
1470 temp1 += aval[k] * aval[k];
1471 temp2 += aval[k] * uval[j];
1473 alpha = (bval[i] - temp2) / temp1;
1474 for (k = begin_row; k < end_row; ++k) {
1476 uval[j] += w * alpha * aval[k];
1516 const INT N =
ABS(i_n - i_1) + 1;
1517 const INT * ia = A->
IA, *ja = A->
JA;
1522 INT i, j, k, begin_row, end_row;
1525 INT myid, mybegin, myend;
1526 INT nthreads = fasp_get_num_threads();
1538#pragma omp parallel for private(myid, mybegin, myend, i, begin_row, end_row, k, j)
1539 for (myid = 0; myid < nthreads; myid++) {
1541 mybegin += i_1, myend += i_1;
1542 for (i = mybegin; i < myend; i += s) {
1545 begin_row = ia[i], end_row = ia[i + 1];
1546 for (k = begin_row; k < end_row; k++) {
1548 t[i] -= aval[k] * uval[j];
1549 d[i] +=
ABS(aval[k]);
1553#pragma omp parallel for private(i)
1554 for (i = i_1; i <= i_n; i += s) {
1559 for (i = i_1; i <= i_n; i += s) {
1563 end_row = ia[i + 1];
1564 for (k = begin_row; k < end_row; ++k) {
1566 t[i] -= aval[k] * uval[j];
1567 d[i] +=
ABS(aval[k]);
1571 for (i = i_1; i <= i_n; i += s) {
1580#pragma omp parallel for private(myid, mybegin, myend, i, k, j, begin_row, end_row)
1581 for (myid = 0; myid < nthreads; myid++) {
1583 mybegin = i_1 - mybegin, myend = i_1 - myend;
1584 for (i = mybegin; i > myend; i += s) {
1587 begin_row = ia[i], end_row = ia[i + 1];
1588 for (k = begin_row; k < end_row; k++) {
1590 t[i] -= aval[k] * uval[j];
1591 d[i] +=
ABS(aval[k]);
1595#pragma omp parallel for private(i)
1596 for (i = i_1; i >= i_n; i += s) {
1601 for (i = i_1; i >= i_n; i += s) {
1605 end_row = ia[i + 1];
1606 for (k = begin_row; k < end_row; ++k) {
1608 t[i] -= aval[k] * uval[j];
1609 d[i] +=
ABS(aval[k]);
1613 for (i = i_1; i >= i_n; i += s) {
1666 b.
val=work; x.
val=work+n;
1670 for (i=0; i<n; ++i) index[i]=i;
1676 for (i=0; i<n; ++i){
1716 printf(
"### ERROR: Unknown smoother type! [%s:%d]\n",
1717 __FILE__, __LINE__);
1723 memcpy(&(B.
JA[i*n]), index, n*
sizeof(
INT));
1731 compress_dCSRmat(&B, &D, dtol);
void fasp_darray_cp(const INT n, const REAL *x, REAL *y)
Copy an array to the other y=x.
void fasp_mem_free(void *mem)
Free up previous allocated memory body and set pointer to NULL.
void * fasp_mem_calloc(const unsigned int size, const unsigned int type)
Allocate, initiate, and check memory.
void fasp_chkerr(const SHORT status, const char *fctname)
Check error status and print out error messages before quit.
void fasp_get_start_end(const INT procid, const INT nprocs, const INT n, INT *start, INT *end)
Assign Load to each thread.
void fasp_dvec_set(INT n, dvector *x, const REAL val)
Initialize dvector x[i]=val for i=0:n-1.
void fasp_blas_darray_axpy(const INT n, const REAL a, const REAL *x, REAL *y)
y = a*x + y
dCSRmat fasp_dcsr_create(const INT m, const INT n, const INT nnz)
Create CSR sparse matrix data memory space.
void fasp_dcsr_free(dCSRmat *A)
Free CSR sparse matrix data memory space.
void fasp_dcsr_getcol(const INT n, const dCSRmat *A, REAL *col)
Get the n-th column of a CSR matrix A.
INT fasp_dcsr_trans(const dCSRmat *A, dCSRmat *AT)
Find transpose of dCSRmat matrix A.
void fasp_blas_dcsr_aAxpy(const REAL alpha, const dCSRmat *A, const REAL *x, REAL *y)
Matrix-vector multiplication y = alpha*A*x + y.
void fasp_smoother_dcsr_sor_cf(dvector *u, dCSRmat *A, dvector *b, INT L, const REAL w, INT *mark, const INT order)
SOR smoother with C/F ordering for Au=b.
void fasp_smoother_dcsr_sor(dvector *u, const INT i_1, const INT i_n, const INT s, dCSRmat *A, dvector *b, INT L, const REAL w)
SOR method as a smoother.
void fasp_smoother_dcsr_kaczmarz(dvector *u, const INT i_1, const INT i_n, const INT s, dCSRmat *A, dvector *b, INT L, const REAL w)
Kaczmarz method as a smoother.
void fasp_smoother_dcsr_jacobi_ff(dvector *x, dCSRmat *A, dvector *b, const INT nsweeps, INT *ordering, const REAL relax)
Weighted Jacobi method as a smoother only for the fine points.
void fasp_smoother_dcsr_sgs(dvector *u, dCSRmat *A, dvector *b, INT L)
Symmetric Gauss-Seidel method as a smoother.
void fasp_smoother_dcsr_gs(dvector *u, const INT i_1, const INT i_n, const INT s, dCSRmat *A, dvector *b, INT L)
Gauss-Seidel method as a smoother.
void fasp_smoother_dcsr_gs_ff(dvector *u, dCSRmat *A, dvector *b, INT L, INT *mark)
Gauss-Seidel smoother with on F-points only for Au=b.
void fasp_smoother_dcsr_ilu(dCSRmat *A, dvector *b, dvector *x, void *data)
ILU method as a smoother.
void fasp_smoother_dcsr_L1diag(dvector *u, const INT i_1, const INT i_n, const INT s, dCSRmat *A, dvector *b, INT L)
Diagonal scaling (using L1 norm) as a smoother.
void fasp_smoother_dcsr_jacobi(dvector *u, const INT i_1, const INT i_n, const INT s, dCSRmat *A, dvector *b, INT L, const REAL w)
Weighted Jacobi method as a smoother.
void fasp_smoother_dcsr_gs_cf(dvector *u, dCSRmat *A, dvector *b, INT L, INT *mark, const INT order)
Gauss-Seidel smoother with C/F ordering for Au=b.
void fasp_smoother_dcsr_poly(dCSRmat *Amat, dvector *brhs, dvector *usol, INT n, INT ndeg, INT L)
poly approx to A^{-1} as MG smoother
Main header file for the FASP project.
INT * ijlu
integer array of row pointers and column indexes, the size is nzlu
REAL * luval
nonzero entries of LU
Sparse matrix of REAL type in CSR format.
INT col
column of matrix A, n
REAL * val
nonzero entries of A
INT row
row number of matrix A, m
INT * IA
integer array of row pointers, the size is m+1
INT * JA
integer array of column indexes, the size is nnz
Vector with n entries of REAL type.
REAL * val
actual vector entries