18#include "fasp_functs.h"
24static inline void fasp_darray_cp_nc3 (
const REAL *x,
REAL *y);
25static inline void fasp_darray_cp_nc5 (
const REAL *x,
REAL *y);
26static inline void fasp_darray_cp_nc7 (
const REAL *x,
REAL *y);
50 const INT nc = diag->
nc, nc2 = nc*nc;
54 for ( i=0; i<m; ++i ) {
90 printf(
"### DEBUG: [-Begin-] %s ...\n", __FUNCTION__);
117 memcpy(zr,r,(size)*
sizeof(
REAL));
123 zz[i]=zr[i]-
ILU_data->offdiag[0][i-1]*zz[i-1];
124 if (i>=nline) zz[i]=zz[i]-
ILU_data->offdiag[2][i-nline]*zz[i-nline];
125 if (i>=nplane) zz[i]=zz[i]-
ILU_data->offdiag[4][i-nplane]*zz[i-nplane];
130 for (i=m-2;i>=0;i--) {
131 zz[i]=zz[i]-
ILU_data->offdiag[1][i]*z[i+1];
132 if (i<m-nline) zz[i]=zz[i]-
ILU_data->offdiag[3][i]*z[i+nline];
133 if (i<m-nplane) zz[i]=zz[i]-
ILU_data->offdiag[5][i]*z[i+nplane];
141 fasp_darray_cp_nc3(&(zr[0]),&(zz[0]));
156 fasp_darray_cp_nc3(&(zr[ic]),&(zz[ic]));
162 for (i=m-2;i>=0;i--) {
187 fasp_darray_cp_nc5(&(zr[0]),&(zz[0]));
202 fasp_darray_cp_nc5(&(zr[ic]),&(zz[ic]));
208 for (i=m-2;i>=0;i--) {
234 fasp_darray_cp_nc7(&(zr[0]),&(zz[0]));
249 fasp_darray_cp_nc7(&(zr[ic]),&(zz[ic]));
255 for (i=m-2;i>=0;i--) {
304 for (i=m-2;i>=0;i--) {
331 printf(
"### DEBUG: [--End--] %s ...\n", __FUNCTION__);
391 for (i=0;i<size;++i) zr[i]=r[i];
397 zz[i]=zr[i]-
ILU_data->offdiag[0][i-1]*zz[i-1];
399 zz[i]=zz[i]-
ILU_data->offdiag[2][i-nline+1]*zz[i-nline+1];
402 zz[i]=zz[i]-
ILU_data->offdiag[4][i-nline]*zz[i-nline];
404 zz[i]=zz[i]-
ILU_data->offdiag[6][i-nplane+nline]*zz[i-nplane+nline];
406 zz[i]=zz[i]-
ILU_data->offdiag[8][i-nplane+1]*zz[i-nplane+1];
408 zz[i]=zz[i]-
ILU_data->offdiag[10][i-nplane]*zz[i-nplane];
414 for (i=m-2;i>=0;i--) {
416 zz[i]=zz[i]-
ILU_data->offdiag[1][i]*z[i+1];
418 zz[i]=zz[i]-
ILU_data->offdiag[3][i]*z[i+nline-1];
420 zz[i]=zz[i]-
ILU_data->offdiag[5][i]*z[i+nline];
421 if (i+nplane-nline<m)
422 zz[i]=zz[i]-
ILU_data->offdiag[7][i]*z[i+nplane-nline];
424 zz[i]=zz[i]-
ILU_data->offdiag[9][i]*z[i+nplane-1];
426 zz[i]=zz[i]-
ILU_data->offdiag[11][i]*z[i+nplane];
437 fasp_darray_cp_nc3(&(zr[0]),&(zz[0]));
458 if (i>=nplane-nline) {
476 fasp_darray_cp_nc3(&(zr[ic]),&(zz[ic]));
484 for (i=m-2;i>=0;i--) {
504 if (i+nplane-nline<m) {
531 fasp_darray_cp_nc5(&(zr[0]),&(zz[0]));
552 if (i>=nplane-nline) {
570 fasp_darray_cp_nc5(&(zr[ic]),&(zz[ic]));
578 for (i=m-2;i>=0;i--) {
598 if (i+nplane-nline<m) {
625 fasp_darray_cp_nc7(&(zr[0]),&(zz[0]));
646 if (i>=nplane-nline) {
664 fasp_darray_cp_nc7(&(zr[ic]),&(zz[ic]));
672 for (i=m-2;i>=0;i--) {
692 if (i+nplane-nline<m) {
738 if (i>=nplane-nline) {
763 for (i=m-2;i>=0;i--) {
782 if (i+nplane-nline<m) {
866 memcpy(zr,r,(size)*
sizeof(
REAL));
871 zz[i]=zr[i]-
ILU_data->offdiag[0][i-1]*zz[i-1];
872 if (i>=nline) zz[i]=zz[i]-
ILU_data->offdiag[2][i-nline]*zz[i-nline];
873 if (i>=nplane) zz[i]=zz[i]-
ILU_data->offdiag[4][i-nplane]*zz[i-nplane];
879 fasp_darray_cp_nc3(&(zr[0]),&(zz[0]));
893 fasp_darray_cp_nc3(&(zr[ic]),&(zz[ic]));
900 fasp_darray_cp_nc5(&(zr[0]),&(zz[0]));
914 fasp_darray_cp_nc5(&(zr[ic]),&(zz[ic]));
922 fasp_darray_cp_nc7(&(zr[0]),&(zz[0]));
936 fasp_darray_cp_nc7(&(zr[ic]),&(zz[ic]));
966 memcpy(z,zz,(size)*
sizeof(
REAL));
1027 memcpy(zz,r,(size)*
sizeof(
REAL));
1031 z[m-1]=zz[m-1]*
ILU_data->diag[m-1];
1032 for (i=m-2;i>=0;i--) {
1033 zz[i]=zz[i]-
ILU_data->offdiag[1][i]*z[i+1];
1034 if (i<m-nline) zz[i]=zz[i]-
ILU_data->offdiag[3][i]*z[i+nline];
1035 if (i<m-nplane) zz[i]=zz[i]-
ILU_data->offdiag[5][i]*z[i+nplane];
1045 for (i=m-2;i>=0;i--) {
1072 for (i=m-2;i>=0;i--) {
1099 for (i=m-2;i>=0;i--) {
1128 for (i=m-2;i>=0;i--) {
1211 memcpy(zr,r,(size)*
sizeof(
REAL));
1217 zz[i]=zr[i]-
ILU_data->offdiag[0][i-1]*zz[i-1];
1219 zz[i]=zz[i]-
ILU_data->offdiag[2][i-nline+1]*zz[i-nline+1];
1222 zz[i]=zz[i]-
ILU_data->offdiag[4][i-nline]*zz[i-nline];
1223 if (i>=nplane-nline)
1224 zz[i]=zz[i]-
ILU_data->offdiag[6][i-nplane+nline]*zz[i-nplane+nline];
1226 zz[i]=zz[i]-
ILU_data->offdiag[8][i-nplane+1]*zz[i-nplane+1];
1228 zz[i]=zz[i]-
ILU_data->offdiag[10][i-nplane]*zz[i-nplane];
1236 fasp_darray_cp_nc3(&(zr[0]),&(zz[0]));
1256 if (i>=nplane-nline) {
1274 fasp_darray_cp_nc3(&(zr[ic]),&(zz[ic]));
1282 fasp_darray_cp_nc5(&(zr[0]),&(zz[0]));
1302 if (i>=nplane-nline) {
1320 fasp_darray_cp_nc5(&(zr[ic]),&(zz[ic]));
1328 fasp_darray_cp_nc7(&(zr[0]),&(zz[0]));
1348 if (i>=nplane-nline) {
1366 fasp_darray_cp_nc7(&(zr[ic]),&(zz[ic]));
1392 if (i>=nplane-nline) {
1413 memcpy(z,zz,(size)*
sizeof(
REAL));
1475 memcpy(zz,r,(size)*
sizeof(
REAL));
1479 z[m-1]=zz[m-1]*
ILU_data->diag[m-1];
1480 for (i=m-2;i>=0;i--) {
1482 zz[i]=zz[i]-
ILU_data->offdiag[1][i]*z[i+1];
1484 zz[i]=zz[i]-
ILU_data->offdiag[3][i]*z[i+nline-1];
1486 zz[i]=zz[i]-
ILU_data->offdiag[5][i]*z[i+nline];
1487 if (i+nplane-nline<m)
1488 zz[i]=zz[i]-
ILU_data->offdiag[7][i]*z[i+nplane-nline];
1490 zz[i]=zz[i]-
ILU_data->offdiag[9][i]*z[i+nplane-1];
1492 zz[i]=zz[i]-
ILU_data->offdiag[11][i]*z[i+nplane];
1506 for (i=m-2;i>=0;i--) {
1526 if (i+nplane-nline<m) {
1556 for (i=m-2;i>=0;i--) {
1576 if (i+nplane-nline<m) {
1606 for (i=m-2;i>=0;i--) {
1626 if (i+nplane-nline<m) {
1656 for (i=m-2;i>=0;i--) {
1675 if (i+nplane-nline<m) {
1727 const INT nc = A->
nc;
1729 const INT n = nc*ngrid;
1736 fasp_smoother_dstr_swz(A, &rr, &zz, diaginv, pivot, neigh, order);
1754static inline void fasp_darray_cp_nc3 (
const REAL *x,
1757 memcpy(y, x, 3*
sizeof(
REAL));
1771static inline void fasp_darray_cp_nc5 (
const REAL *x,
1774 memcpy(y, x, 5*
sizeof(
REAL));
1788static inline void fasp_darray_cp_nc7 (
const REAL *x,
1791 memcpy(y, x, 7*
sizeof(
REAL));
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_dvec_set(INT n, dvector *x, const REAL val)
Initialize dvector x[i]=val for i=0:n-1.
void fasp_blas_darray_axpy_nc3(const REAL a, const REAL *x, REAL *y)
y = a*x + y, length of x and y should be 3
void fasp_blas_darray_axpy_nc7(const REAL a, const REAL *x, REAL *y)
y = a*x + y, length of x and y should be 7
void fasp_blas_darray_axpy_nc5(const REAL a, const REAL *x, REAL *y)
y = a*x + y, length of x and y should be 5
void fasp_blas_darray_axpy(const INT n, const REAL a, const REAL *x, REAL *y)
y = a*x + y
void fasp_blas_smat_mxv_nc7(const REAL *a, const REAL *b, REAL *c)
Compute the product of a 7*7 matrix a and a array b, stored in c.
void fasp_blas_smat_mxv_nc5(const REAL *a, const REAL *b, REAL *c)
Compute the product of a 5*5 matrix a and a array b, stored in c.
void fasp_blas_smat_mxv(const REAL *a, const REAL *b, REAL *c, const INT n)
Compute the product of a small full matrix a and a array b, stored in c.
void fasp_blas_smat_mxv_nc3(const REAL *a, const REAL *b, REAL *c)
Compute the product of a 3*3 matrix a and a array b, stored in c.
void fasp_precond_dstr_ilu0_forward(REAL *r, REAL *z, void *data)
Preconditioning using STR_ILU(0) decomposition: Lz = r.
void fasp_precond_dstr_diag(REAL *r, REAL *z, void *data)
Diagonal preconditioner z=inv(D)*r.
void fasp_precond_dstr_ilu1_forward(REAL *r, REAL *z, void *data)
Preconditioning using STR_ILU(1) decomposition: Lz = r.
void fasp_precond_dstr_blockgs(REAL *r, REAL *z, void *data)
CPR-type preconditioner (STR format)
void fasp_precond_dstr_ilu1(REAL *r, REAL *z, void *data)
Preconditioning using STR_ILU(1) decomposition.
void fasp_precond_dstr_ilu0(REAL *r, REAL *z, void *data)
Preconditioning using STR_ILU(0) decomposition.
void fasp_precond_dstr_ilu1_backward(REAL *r, REAL *z, void *data)
Preconditioning using STR_ILU(1) decomposition: Uz = r.
void fasp_precond_dstr_ilu0_backward(REAL *r, REAL *z, void *data)
Preconditioning using STR_ILU(0) decomposition: Uz = r.
Main header file for the FASP project.
Structure matrix of REAL type.
INT nc
size of each block (number of components)
Vector with n entries of REAL type.
REAL * val
actual vector entries
Vector with n entries of INT type.
Data for preconditioners in dSTRmat format.
ivector * neigh
array to store neighbor information
ivector * pivot
the pivot for the GS/block GS smoother (whole reservoir matrix)
dSTRmat * A_str
store the whole reservoir block in STR format
ivector * order
order for smoothing
dvector * diaginv
the inverse of the diagonals for GS/block GS smoother (whole reservoir matrix)
Data for diagonal preconditioners in dSTRmat format.
INT nc
number of components
dvector diag
diagonal elements