23#include "fasp_functs.h"
140 if (m <= 0 || n <= 0) {
141 printf(
"### ERROR: Matrix dim %d, %d must be positive! [%s]\n", m, n,
186 if (A == NULL)
return;
221 if (A == NULL)
return;
248 const INT* ia = A->
IA;
251 for (max = i = 0; i < row; ++i) max =
MAX(max, ia[i + 1] - ia[i]);
278 const INT * ia = A->
IA, *ja = A->
JA;
280 INT i, j, k, jaj, i1, i2, start;
286 nthreads = fasp_get_num_threads();
296 INT myid, mybegin, myend;
298#pragma omp parallel for private(myid, mybegin, myend, i)
300 for (myid = 0; myid < nthreads; ++myid) {
302 for (i = mybegin; i < myend; ++i) Pt[P[i]] = i;
305 for (i = 0; i < n; ++i) Pt[P[i]] = i;
310 for (i = 0; i < n; ++i) {
312 Aperm.
IA[i + 1] = Aperm.
IA[i] + (ia[k + 1] - ia[k]);
317 INT myid, mybegin, myend;
319#pragma omp parallel for private(myid, mybegin, myend, i1, i2, k, start, j, jaj)
321 for (myid = 0; myid < nthreads; ++myid) {
323 for (i = mybegin; i < myend; ++i) {
325 i2 = Aperm.
IA[i + 1] - 1;
328 for (j = i1; j <= i2; ++j) {
329 jaj = start + j - i1;
330 Aperm.
JA[j] = ja[jaj];
331 Aperm.
val[j] = Aval[jaj];
336 for (i = 0; i < n; ++i) {
338 i2 = Aperm.
IA[i + 1] - 1;
341 for (j = i1; j <= i2; ++j) {
342 jaj = start + j - i1;
343 Aperm.
JA[j] = ja[jaj];
344 Aperm.
val[j] = Aval[jaj];
351 INT myid, mybegin, myend;
353#pragma omp parallel for private(myid, mybegin, myend, k, j)
355 for (myid = 0; myid < nthreads; ++myid) {
357 for (k = mybegin; k < myend; ++k) {
363 for (k = 0; k < nnz; ++k) {
388 INT i, j, start, row_length;
398 for (i = 0; i < n; ++i) {
400 row_length = A->
IA[i + 1] - start;
402 for (j = 0; j < row_length; ++j) index[j] = j;
406 for (j = 0; j < row_length; ++j) {
407 ja[j] = A->
JA[start + index[j]];
408 a[j] = A->
val[start + index[j]];
411 for (j = 0; j < row_length; ++j) {
412 A->
JA[start + j] = ja[j];
413 A->
val[start + j] = a[j];
451 INT i, j, k, nnz = 0;
455 INT stride_i, mybegin, myend, myid, nthreads;
458 nthreads = fasp_get_num_threads();
480 stride_i = n / nthreads;
481#pragma omp parallel private(myid, mybegin, myend, i) num_threads(nthreads)
483 myid = omp_get_thread_num();
484 mybegin = myid * stride_i;
485 if (myid < nthreads - 1)
486 myend = mybegin + stride_i;
489 for (i = mybegin; i < myend; ++i) {
490 col_flag[Js[i]] = i + 1;
495 for (i = 0; i < n; ++i) col_flag[Js[i]] = i + 1;
500 for (i = 0; i < m; ++i) {
501 for (k = A->
IA[Is[i]]; k < A->IA[Is[i] + 1]; ++k) {
503 if (col_flag[j] > 0) {
504 B->
JA[nnz] = col_flag[j] - 1;
539 INT i, k, j, ibegin, iend;
548 nthreads = fasp_get_num_threads();
555 INT mybegin, myend, myid;
557#pragma omp parallel for private(myid, mybegin, myend, i, ibegin, iend, k, j)
559 for (myid = 0; myid < nthreads; myid++) {
561 for (i = mybegin; i < myend; i++) {
564 for (k = ibegin; k < iend; ++k) {
574 for (i = 0; i < n; ++i) {
577 for (k = ibegin; k < iend; ++k) {
604 INT i, j, row_begin, row_end;
613 nthreads = fasp_get_num_threads();
618 if (n < 0 || n >= ncol) {
619 printf(
"### ERROR: Illegal column index %d! [%s]\n", n, __FUNCTION__);
626 INT mybegin, myend, myid;
629#pragma omp parallel for private(myid, mybegin, myend, i, j, row_begin, row_end)
631 for (myid = 0; myid < nthreads; myid++) {
633 for (i = mybegin; i < myend; i++) {
635 row_begin = A->
IA[i];
636 row_end = A->
IA[i + 1];
637 for (j = row_begin; j < row_end; ++j) {
645 for (i = 0; i < nrow; ++i) {
648 row_begin = A->
IA[i];
649 row_end = A->
IA[i + 1];
650 for (j = row_begin; j < row_end; ++j) {
682 const INT num_rowsA = A->
row;
694 INT myid, mybegin, myend, ibegin, iend;
695 INT nthreads = fasp_get_num_threads();
699 printf(
"### DEBUG: [-Begin-] %s ...\n", __FUNCTION__);
704#pragma omp parallel for private(myid, i, j, ibegin, iend, tempi, tempd, mybegin, myend)
705 for (myid = 0; myid < nthreads; myid++) {
707 for (i = mybegin; i < myend; i++) {
711 if (A_j[ibegin] != i) {
712 for (j = ibegin + 1; j < iend; j++) {
715 printf(
"### DEBUG: Switch entry_%d with entry_0\n", j);
718 A_j[ibegin] = A_j[j];
721 tempd = A_data[ibegin];
722 A_data[ibegin] = A_data[j];
728 printf(
"### ERROR: Diagonal entry %d is zero!\n", i);
736 for (i = 0; i < num_rowsA; i++) {
737 row_size = A_i[i + 1] - A_i[i];
740 for (j = 1; j < row_size; j++) {
743 printf(
"### DEBUG: Switch entry_%d with entry_0\n", j);
750 A_data[0] = A_data[j];
757 printf(
"### ERROR: Diagonal entry %d is zero!\n", i);
769 printf(
"### DEBUG: [--End--] %s ...\n", __FUNCTION__);
789 const INT *ia = A->
IA, *ja = A->
JA;
793 INT i, j, k, begin_row, end_row;
796 for (i = 0; i < m; ++i) {
799 for (k = begin_row; k < end_row; ++k) {
877 const INT n = A->
row, m = A->
col, nnz = A->
nnz, m1 = m - 1;
884 printf(
"### DEBUG: m=%d, n=%d, nnz=%d\n", m, n, nnz);
905 for (j = 0; j < nnz; ++j) {
907 if (i < m1) AT->
IA[i + 2]++;
910 for (i = 2; i <= m; ++i) AT->
IA[i] += AT->
IA[i - 1];
913 if (A->
val != NULL) {
914 for (i = 0; i < n; ++i) {
917 for (p = ibegin; p < iend; p++) {
926 for (i = 0; i < n; ++i) {
929 for (p = ibegin; p < iend; p++) {
984 memset(AT->
IA, 0,
sizeof(
INT) * (m + 1));
986 for (j = 0; j < nnz; ++j) {
988 if (i < m - 1) AT->
IA[i + 2]++;
991 for (i = 2; i <= m; ++i) AT->
IA[i] += AT->
IA[i - 1];
995 for (i = 0; i < n; ++i) {
996 INT ibegin = A->
IA[i], iend = A->
IA[i + 1];
997 for (p = ibegin; p < iend; p++) {
1006 for (i = 0; i < n; ++i) {
1007 INT ibegin = A->
IA[i], iend1 = A->
IA[i + 1];
1008 for (p = ibegin; p < iend1; p++) {
1039 const INT nca = nn[1];
1048 for (i = 0; i < tniz[0]; ++i) izc[col[0][i]]++;
1051 for (i = 1; i < nca; ++i) izcaux[i] = izcaux[i - 1] + izc[i - 1];
1054 memset(izc, 0, nca *
sizeof(
INT));
1056 for (i = 0; i < tniz[0]; ++i) {
1058 itmp = izcaux[m] + izc[m];
1060 col[1][itmp] = row[0][i];
1061 val[1][itmp] = val[0][i];
1096 nthreads = fasp_get_num_threads();
1107 B->
IA[0] = A->
IA[0];
1111 for (i = 0; i < A->
row; ++i) {
1113 iend1 = A->
IA[i + 1];
1114 for (j = ibegin; j < iend1; ++j)
1115 if (
ABS(A->
val[j]) > dtol) {
1127 INT myid, mybegin, myend;
1129#pragma omp parallel for private(myid, i, mybegin, myend)
1131 for (myid = 0; myid < nthreads; myid++) {
1133 for (i = mybegin; i < myend; ++i) {
1134 B->
JA[i] = A->
JA[index[i]];
1135 B->
val[i] = A->
val[index[i]];
1139 for (i = 0; i < B->
nnz; ++i) {
1140 B->
JA[i] = A->
JA[index[i]];
1141 B->
val[i] = A->
val[index[i]];
1172 INT ibegin, iend = A->
IA[0];
1175 for (i = 0; i < row; ++i) {
1177 iend = A->
IA[i + 1];
1178 for (j = ibegin; j < iend; ++j)
1179 if (
ABS(A->
val[j]) > dtol || i == A->
JA[j]) {
1180 A->
JA[k] = A->
JA[j];
1192 printf(
"### WARNING: Size of compressed matrix is bigger than original!\n");
1215 const INT n = A->
row + 1;
1216 INT i, *ai = A->
IA, *aj = A->
JA;
1222 nthreads = fasp_get_num_threads();
1227 INT myid, mybegin, myend;
1229#pragma omp parallel for private(myid, mybegin, myend, i)
1231 for (myid = 0; myid < nthreads; myid++) {
1233 for (i = mybegin; i < myend; i++) {
1238 for (i = 0; i < n; ++i) ai[i] += offset;
1242 INT myid, mybegin, myend;
1244#pragma omp parallel for private(myid, mybegin, myend, i)
1246 for (myid = 0; myid < nthreads; myid++) {
1248 for (i = mybegin; i < myend; i++) {
1253 for (i = 0; i < nnz; ++i) aj[i] += offset;
1274 const INT* IA = A->
IA;
1275 const INT* JA = A->
JA;
1282 INT i, j, k, row_start, row_end;
1287 nthreads = fasp_get_num_threads();
1291 if (diag->
row != n) {
1292 printf(
"### ERROR: Size of diag = %d != size of matrix = %d!", diag->
row, n);
1300 INT myid, mybegin, myend;
1302#pragma omp parallel for private(myid, mybegin, myend, i)
1304 for (myid = 0; myid < nthreads; myid++) {
1306 for (i = mybegin; i < myend; i++) work[i] = sqrt(diag->
val[i]);
1310 for (i = 0; i < n; i++) work[i] = sqrt(diag->
val[i]);
1314 INT myid, mybegin, myend;
1316#pragma omp parallel for private(myid, mybegin, myend, row_start, row_end, i, j, k)
1318 for (myid = 0; myid < nthreads; myid++) {
1320 for (i = mybegin; i < myend; i++) {
1322 row_end = IA[i + 1];
1323 for (j = row_start; j < row_end; j++) {
1325 val[j] = val[j] / (work[i] * work[k]);
1331 for (i = 0; i < n; i++) {
1333 row_end = IA[i + 1];
1334 for (j = row_start; j < row_end; j++) {
1336 val[j] = val[j] / (work[i] * work[k]);
1365#if MULTI_COLOR_ORDER
1422 const INT * ia = NULL, *ja = NULL;
1423 const REAL* a = NULL;
1429 INT * iat = NULL, *jat = NULL;
1433 INT i, j, jp, pi, iabeg, iaend, k;
1444 for (i = 0; i < m1; ++i) iat[i] = 0;
1446 for (i = 0; i < iaend; ++i) {
1448 if (j < m1) iat[j]++;
1453 for (i = 2; i < m1; ++i) {
1454 iat[i] += iat[i - 1];
1460 for (i = 0; i < n; ++i) {
1464 if (iaend > iabeg) {
1465 for (jp = iabeg; jp < iaend; ++jp) {
1474 }
else if (a && !p) {
1476 for (i = 0; i < n; ++i) {
1479 if (iaend > iabeg) {
1480 for (jp = iabeg; jp < iaend; ++jp) {
1489 }
else if (!a && p) {
1491 for (i = 0; i < n; ++i) {
1495 if (iaend > iabeg) {
1496 for (jp = iabeg; jp < iaend; ++jp) {
1506 for (i = 0; i < n; ++i) {
1509 if (iaend > iabeg) {
1510 for (jp = iabeg; jp < iaend; ++jp) {
1581 if ((m == n) && (isym))
1604#if MULTI_COLOR_ORDER
1605 INT k, i, j, pre, group;
1612 INT* cq = (
INT*)malloc(
sizeof(
INT) * (n + 1));
1613 INT* newr = (
INT*)malloc(
sizeof(
INT) * (n + 1));
1616#pragma omp parallel for private(k)
1618 for (k = 0; k < n; k++) cq[k] = k;
1621 for (k = 0; k < n; k++) {
1622 if ((IA[k + 1] - IA[k]) > group) group = IA[k + 1] - IA[k];
1625 A->IC = (
INT*)malloc(
sizeof(
INT) * (group + 2));
1626 A->ICMAP = (
INT*)malloc(
sizeof(
INT) * (n));
1631 memset(newr, -1,
sizeof(
INT) * (n + 1));
1632 memset(A->ICMAP, 0,
sizeof(
INT) * n);
1641 if (front == n) front = 0;
1644 A->IC[group] = icount;
1645 A->ICMAP[icount] = i;
1649 for (j = IA[i]; j < iend; j++) newr[JA[j]] = group;
1650 }
else if (newr[i] == group) {
1652 if (rear == n) rear = 0;
1655 A->ICMAP[icount] = i;
1658 for (j = IA[i]; j < iend; j++) newr[JA[j]] = group;
1662 }
while (rear != front);
1664 A->IC[group] = icount;
1670 printf(
"### ERROR: %s has not been defined!\n", __FUNCTION__);
1689#if MULTI_COLOR_ORDER
1690 INT k, i, j, pre, group;
1691 INT igold, iend, iavg;
1698 INT* cq = (
INT*)malloc(
sizeof(
INT) * (n + 1));
1699 INT* newr = (
INT*)malloc(
sizeof(
INT) * (n + 1));
1701 for (k = 0; k < n; k++) cq[k] = k;
1705 for (k = 0; k < n; k++) {
1706 if ((IA[k + 1] - IA[k]) > group) group = IA[k + 1] - IA[k];
1711 igold = (
INT)
MAX(iavg,group*0.618) +1;
1715 A->IC = (
INT*)malloc(
sizeof(
INT) * (group + 2));
1716 A->ICMAP = (
INT*)malloc(
sizeof(
INT) * (n));
1721 memset(newr, -1,
sizeof(
INT) * (n + 1));
1722 memset(A->ICMAP, 0,
sizeof(
INT) * n);
1732 if (front == n) front = 0;
1736 A->IC[group] = icount;
1737 A->ICMAP[icount] = i;
1741 for (j = IA[i]; j < iend; j++) newr[JA[j]] = group;
1742 }
else if (newr[i] == group) {
1745 if (rear == n) rear = 0;
1748 A->ICMAP[icount] = i;
1751 for (j = IA[i]; j < iend; j++) newr[JA[j]] = group;
1754 }
while (rear != front);
1756 A->IC[group] = icount;
1760 for(i=0; i < A->color; i++ ){
1761 for(j=A -> IC[i]; j < A-> IC[i+1];j++)
1762 printf(
"color %d ICMAP[%d] = %d \n", i,j,A-> ICMAP[j]);
1763 printf(
"A.color = %d A.row= %d %d\n",A -> color,A -> row,A-> IC[i+1] - A-> IC[i] );
1776#if MULTI_COLOR_ORDER
1780 const INT row_plus_one = row + 1;
1781 const INT nnz = A->
IA[row] - A->
IA[0];
1783 INT index, i, j, begin_row, end_row;
1784 INT * ia = A->
IA, *ja = A->
JA;
1807#pragma omp parallel for private(i, j, begin_row, end_row, row_abs_sum)
1809 for (i = 0; i < row; ++i) {
1813 end_row = ia[i + 1];
1814 for (j = begin_row; j < end_row; j++) {
1815 row_abs_sum +=
ABS(aj[j]);
1817 row_abs_sum = row_abs_sum * theta;
1820 for (j = begin_row; j < end_row; j++) {
1821 if ((row_abs_sum >=
ABS(aj[j])) && (ja[j] != i)) {
1829 for (i = 0; i < row; ++i) {
1832 end_row = ia[i + 1] - 1;
1833 for (j = begin_row; j <= end_row; j++) {
1834 if (S->
JA[j] > -1) {
1835 S->
JA[index] = S->
JA[j];
1870#if MULTI_COLOR_ORDER
1871 INT k, i, j, pre, group;
1872 INT igold, iend, iavg;
1879 INT* cq = (
INT*)malloc(
sizeof(
INT) * (n + 1));
1880 INT* newr = (
INT*)malloc(
sizeof(
INT) * (n + 1));
1883#pragma omp parallel for private(k)
1885 for (k = 0; k < n; k++) {
1889 for (k = 0; k < n; k++) {
1890 if ((IA[k + 1] - IA[k]) > group) group = IA[k + 1] - IA[k];
1895 igold = (
INT)
MAX(iavg, group * 0.618) + 1;
1899 A->IC = (
INT*)malloc(
sizeof(
INT) * (group + 2));
1900 A->ICMAP = (
INT*)malloc(
sizeof(
INT) * (n + 1));
1905 memset(newr, -1,
sizeof(
INT) * (n + 1));
1906 memset(A->ICMAP, 0,
sizeof(
INT) * n);
1916 if (front == n) front = 0;
1920 A->IC[group] = icount;
1921 A->ICMAP[icount] = i;
1925 if ((IA[i+1]-IA[i]) > igold)
1926 iend =
MIN(IA[i+1], (IA[i] + igold));
1930 for (j = IA[i]; j < iend; j++) newr[JA[j]] = group;
1931 }
else if (newr[i] == group) {
1934 if (rear == n) rear = 0;
1937 A->ICMAP[icount] = i;
1940 if ((IA[i+1] - IA[i]) > igold) iend =
MIN(IA[i+1], (IA[i] + igold));
1944 for (j = IA[i]; j < iend; j++) newr[JA[j]] = group;
1948 }
while (rear != front);
1950 A->IC[group] = icount;
1954 for(i=0; i < A->color; i++ ){
1955 for(j=A -> IC[i]; j < A-> IC[i+1];j++)
1956 printf(
"color %d ICMAP[%d] = %d \n", i,j,A-> ICMAP[j]);
1957 printf(
"A.color = %d A.row= %d %d\n",A -> color,A -> row,A-> IC[i+1] - A-> IC[i] );
1961 printf(
" Max Row Numbers %d avg %d igold %d max %d %d\n", group, iavg, igold,
1962 (
INT)
MAX(iavg, group * 0.618), A->
IA[n] / n);
1986#if MULTI_COLOR_ORDER
1987 INT k, i, j, pre, group;
1988 INT igold, iend, iavg;
1995 if (theta > 0 && theta < 1.0) {
1996 generate_S_theta(A, &S, theta);
1999 }
else if (theta == 1.0) {
2001 A->IC = (
INT*)malloc(
sizeof(
INT) * 2);
2002 A->ICMAP = (
INT*)malloc(
sizeof(
INT) * (n + 1));
2006#pragma omp parallel for private(k)
2008 for (k = 0; k < n; k++) A->ICMAP[k] = k;
2013 printf(
"Theta = %lf \n", theta);
2022 INT* cq = (
INT*)malloc(
sizeof(
INT) * (n + 1));
2023 INT* newr = (
INT*)malloc(
sizeof(
INT) * (n + 1));
2026#pragma omp parallel for private(k)
2028 for (k = 0; k < n; k++) {
2032 for (k = 0; k < n; k++) {
2033 if ((A->
IA[k + 1] - A->
IA[k]) > group) group = A->
IA[k + 1] - A->
IA[k];
2039 igold = (
INT)
MAX(iavg,group*0.618) +1;
2043 A->IC = (
INT*)malloc(
sizeof(
INT) * (group + 2));
2044 A->ICMAP = (
INT*)malloc(
sizeof(
INT) * (n + 1));
2049 memset(newr, -1,
sizeof(
INT) * (n + 1));
2050 memset(A->ICMAP, 0,
sizeof(
INT) * n);
2060 if (front == n) front = 0;
2064 A->IC[group] = icount;
2065 A->ICMAP[icount] = i;
2069 if ((IA[i+1]-IA[i]) > igold)
2070 iend =
MIN(IA[i+1], (IA[i] + igold));
2074 for (j = IA[i]; j < iend; j++) newr[JA[j]] = group;
2075 }
else if (newr[i] == group) {
2078 if (rear == n) rear = 0;
2081 A->ICMAP[icount] = i;
2084 if ((IA[i+1] - IA[i]) > igold) iend =
MIN(IA[i+1], (IA[i] + igold));
2088 for (j = IA[i]; j < iend; j++) newr[JA[j]] = group;
2093 }
while (rear != front);
2096 A->IC[group] = icount;
2100 for(i=0; i < A->color; i++ ){
2101 for(j=A -> IC[i]; j < A-> IC[i+1];j++)
2102 printf(
"color %d ICMAP[%d] = %d \n", i,j,A-> ICMAP[j]);
2103 printf(
"A.color = %d A.row= %d %d\n",A -> color,A -> row,A-> IC[i+1] - A-> IC[i] );
2106 printf(
" Max Row Numbers %d avg %d igold %d max %d %d\n", group, iavg, igold, (
INT)
MAX(iavg,group*0.618),A->
IA[n]/n );
2126#if MULTI_COLOR_ORDER
2128 const INT * ia = A->
IA, *ja = A->
JA;
2132 INT i, j, k, begin_row, end_row;
2135 INT myid, mybegin, myend;
2136 INT color = A->color;
2138 INT* ICMAP = A->ICMAP;
2144 for (myid = color - 1; myid > -1; myid--) {
2146 myend = IC[myid + 1];
2148#pragma omp parallel for private(I, i, t, begin_row, end_row, k, j, d)
2150 for (I = mybegin; I < myend; I++) {
2153 begin_row = ia[i], end_row = ia[i + 1];
2154 for (k = begin_row; k < end_row; k++) {
2157 t -= aj[k] * uval[j];
2169 for (myid = 0; myid < color; myid++) {
2171 myend = IC[myid + 1];
2173#pragma omp parallel for private(I, i, t, begin_row, end_row, k, j, d)
2175 for (I = mybegin; I < myend; I++) {
2178 begin_row = ia[i], end_row = ia[i + 1];
2179 for (k = begin_row; k < end_row; k++) {
2182 t -= aj[k] * uval[j];
2192 printf(
"### ERROR: MULTI_COLOR_ORDER has not been turn on!!! \n");
void fasp_iarray_set(const INT n, INT *x, const INT val)
Set initial value for an array to be x=val.
void fasp_darray_cp(const INT n, const REAL *x, REAL *y)
Copy an array to the other y=x.
void fasp_iarray_cp(const INT n, const INT *x, INT *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_realloc(void *oldmem, const LONGLONG tsize)
Reallocate, initiate, and check memory.
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_aux_iQuickSortIndex(INT *a, INT left, INT right, INT *index)
Reorder the index of (INT type) so that 'a' is in ascending order.
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_alloc(const INT m, dvector *u)
Create dvector data space of REAL type.
void fasp_dcsr_diagpref(dCSRmat *A)
Re-order the column and data arrays of a CSR matrix, so that the first entry in each row is the diago...
dCSRmat fasp_dcsr_create(const INT m, const INT n, const INT nnz)
Create CSR sparse matrix data memory space.
void fasp_dcsr_shift(dCSRmat *A, const INT offset)
Re-index a REAL matrix in CSR format to make the index starting from 0 or 1.
void fasp_icsr_trans(const iCSRmat *A, iCSRmat *AT)
Find transpose of iCSRmat matrix A.
void dCSRmat_Multicoloring_Theta(dCSRmat *A, REAL theta, INT *rowmax, INT *groups)
Use the greedy multicoloring algorithm to get color groups for for the adjacency graph of A.
SHORT fasp_dcsr_getblk(const dCSRmat *A, const INT *Is, const INT *Js, const INT m, const INT n, dCSRmat *B)
Get a sub CSR matrix of A with specified rows and columns.
void fasp_dcsr_compress(const dCSRmat *A, dCSRmat *B, const REAL dtol)
Compress a CSR matrix A and store in CSR matrix B by dropping small entries abs(aij)<=dtol.
void fasp_dcsr_free(dCSRmat *A)
Free CSR sparse matrix data memory space.
void dCSRmat_Multicoloring_Strong_Coupled(dCSRmat *A, iCSRmat *S, INT *flags, INT *groups)
Use the greedy multicoloring algorithm to get color groups for the adjacency graph of A.
void fasp_dcsr_transz(dCSRmat *A, INT *p, dCSRmat *AT)
Generalized transpose of A: (n x m) matrix given in dCSRmat format.
SHORT fasp_dcsr_regdiag(dCSRmat *A, const REAL value)
Regularize diagonal entries of a CSR sparse matrix.
void fasp_dcsr_sort(dCSRmat *A)
Sort each row of A in ascending order w.r.t. column indices.
void fasp_icsr_free(iCSRmat *A)
Free CSR sparse matrix data memory space.
void fasp_dcsr_multicoloring(dCSRmat *A, INT *flags, INT *groups)
Use the greedy multi-coloring to get color groups of the adjacency graph of A.
void dCSRmat_Multicoloring(dCSRmat *A, INT *rowmax, INT *groups)
Use the greedy multicoloring algorithm to get color groups for for the adjacency graph of A.
void fasp_dcsr_cp(const dCSRmat *A, dCSRmat *B)
copy a dCSRmat to a new one B=A
void fasp_dcsr_transpose(INT *row[2], INT *col[2], REAL *val[2], INT *nn, INT *tniz)
Transpose of a dCSRmat matrix.
SHORT fasp_dcsr_compress_inplace(dCSRmat *A, const REAL dtol)
Compress a CSR matrix A IN PLACE by dropping small entries abs(aij)<=dtol.
iCSRmat fasp_icsr_create(const INT m, const INT n, const INT nnz)
Create 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_bandwidth(const dCSRmat *A)
Get bandwith of matrix.
void fasp_dcsr_getdiag(INT n, const dCSRmat *A, dvector *diag)
Get first n diagonal entries of a CSR matrix A.
dCSRmat fasp_dcsr_permz(dCSRmat *A, INT *p)
Permute rows and cols of A, i.e. A=PAP' by the ordering in p.
void fasp_icsr_cp(const iCSRmat *A, iCSRmat *B)
Copy a iCSRmat to a new one B=A.
void fasp_dcsr_alloc(const INT m, const INT n, const INT nnz, dCSRmat *A)
Allocate CSR sparse matrix memory space.
void fasp_dcsr_symdiagscale(dCSRmat *A, const dvector *diag)
Symmetric diagonal scaling D^{-1/2}AD^{-1/2}.
void fasp_dcsr_sortz(dCSRmat *A, const SHORT isym)
Sort each row of A in ascending order w.r.t. column indices.
dCSRmat fasp_dcsr_sympart(dCSRmat *A)
Get symmetric part of a dCSRmat matrix.
dCSRmat fasp_dcsr_perm(dCSRmat *A, INT *P)
Apply permutation of A, i.e. Aperm=PAP' by the orders given in P.
INT fasp_dcsr_trans(const dCSRmat *A, dCSRmat *AT)
Find transpose of dCSRmat matrix A.
SHORT fasp_blas_dcsr_add(const dCSRmat *A, const REAL alpha, const dCSRmat *B, const REAL beta, dCSRmat *C)
compute C = alpha*A + beta*B in CSR format
Main header file for the FASP project.
#define SHORT
FASP integer and floating point numbers.
#define MAX(a, b)
Definition of max, min, abs.
#define FASP_SUCCESS
Definition of return status and error messages.
#define TRUE
Definition of logic type.
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 nnz
number of nonzero entries
INT * JA
integer array of column indexes, the size is nnz
Vector with n entries of REAL type.
REAL * val
actual vector entries
Sparse matrix of INT type in CSR format.
INT col
column of matrix A, n
INT row
row number of matrix A, m
INT * IA
integer array of row pointers, the size is m+1
INT nnz
number of nonzero entries
INT * JA
integer array of column indexes, the size is nnz
INT * val
nonzero entries of A