18#include "fasp_functs.h"
42#if WITH_UMFPACK || WITH_SuperLU
48 const INT N0 = A_diag[0].
row;
49 const INT N1 = A_diag[1].
row;
50 const INT N2 = A_diag[2].
row;
51 const INT N = N0 + N1 + N2;
59 void **LU_diag = precdata->
LU_diag;
66 r0.
val = r; r1.
val = &(r[N0]); r2.
val = &(r[N0+N1]);
67 z0.
val = z; z1.
val = &(z[N0]); z2.
val = &(z[N0+N1]);
75 r0.
val = r; r1.
val = &(r[N0]); r2.
val = &(r[N0+N1]);
76 z0.
val = z; z1.
val = &(z[N0]); z2.
val = &(z[N0+N1]);
82 fasp_umfpack_solve(&A_diag[0], &r0, &z0, LU_diag[0], 0);
91 fasp_umfpack_solve(&A_diag[1], &r1, &z1, LU_diag[1], 0);
100 fasp_umfpack_solve(&A_diag[2], &r2, &z2, LU_diag[2], 0);
140 const INT N = N0 + N1 + N2;
147 dvector r0, r1, r2, z0, z1, z2;
149 r0.
val = r; r1.
val = &(r[N0]); r2.
val = &(r[N0+N1]); z0.
val = z;
150 z1.
val = &(z[N0]); z2.
val = &(z[N0+N1]);
195#if WITH_UMFPACK || WITH_SuperLU
201 const INT N0 = A_diag[0].
row;
202 const INT N1 = A_diag[1].
row;
203 const INT N2 = A_diag[2].
row;
204 const INT N3 = A_diag[3].
row;
205 const INT N = N0 + N1 + N2 + N3;
213 void **LU_diag = precdata->
LU_diag;
214 dvector r0, r1, r2, r3, z0, z1, z2, z3;
221 r0.
val = r; r1.
val = &(r[N0]); r2.
val = &(r[N0+N1]); r3.
val = &(r[N0+N1+N2]);
222 z0.
val = z; z1.
val = &(z[N0]); z2.
val = &(z[N0+N1]); z3.
val = &(z[N0+N1+N2]);
224 dvector r0, r1, r2, r3, z0, z1, z2, z3;
231 r0.
val = r; r1.
val = &(r[N0]); r2.
val = &(r[N0+N1]); r3.
val = &(r[N0+N1+N2]);
232 z0.
val = z; z1.
val = &(z[N0]); z2.
val = &(z[N0+N1]); z3.
val = &(z[N0+N1+N2]);
238 fasp_umfpack_solve(&A_diag[0], &r0, &z0, LU_diag[0], 0);
247 fasp_umfpack_solve(&A_diag[1], &r1, &z1, LU_diag[1], 0);
256 fasp_umfpack_solve(&A_diag[2], &r2, &z2, LU_diag[2], 0);
265 fasp_umfpack_solve(&A_diag[3], &r3, &z3, LU_diag[3], 0);
295#if WITH_UMFPACK || WITH_SuperLU
303 void **LU_diag = precdata->
LU_diag;
306 const INT N0 = A_diag[0].
row;
307 const INT N1 = A_diag[1].
row;
308 const INT N2 = A_diag[2].
row;
309 const INT N = N0 + N1 + N2;
316 dvector r0, r1, r2, z0, z1, z2;
322 r0.
val = r; r1.
val = &(r[N0]); r2.
val = &(r[N0+N1]);
323 z0.
val = z; z1.
val = &(z[N0]); z2.
val = &(z[N0+N1]);
328 fasp_umfpack_solve(&A_diag[0], &r0, &z0, LU_diag[0], 0);
340 fasp_umfpack_solve(&A_diag[1], &r1, &z1, LU_diag[1], 0);
353 fasp_umfpack_solve(&A_diag[2], &r2, &z2, LU_diag[2], 0);
393 const INT N = N0 + N1 + N2;
402 dvector r0, r1, r2, z0, z1, z2;
404 r0.
val = r; r1.
val = &(r[N0]); r2.
val = &(r[N0+N1]); z0.
val = z;
405 z1.
val = &(z[N0]); z2.
val = &(z[N0+N1]);
457#if WITH_UMFPACK || WITH_SuperLU
465 void **LU_diag = precdata->
LU_diag;
468 const INT N0 = A_diag[0].
row;
469 const INT N1 = A_diag[1].
row;
470 const INT N2 = A_diag[2].
row;
471 const INT N3 = A_diag[3].
row;
472 const INT N = N0 + N1 + N2 + N3;
479 dvector r0, r1, r2, r3, z0, z1, z2, z3;
486 r0.
val = r; r1.
val = &(r[N0]); r2.
val = &(r[N0+N1]); r3.
val = &(r[N0+N1+N2]);
487 z0.
val = z; z1.
val = &(z[N0]); z2.
val = &(z[N0+N1]); z3.
val = &(z[N0+N1+N2]);
492 fasp_umfpack_solve(&A_diag[0], &r0, &z0, LU_diag[0], 0);
504 fasp_umfpack_solve(&A_diag[1], &r1, &z1, LU_diag[1], 0);
517 fasp_umfpack_solve(&A_diag[2], &r2, &z2, LU_diag[2], 0);
531 fasp_umfpack_solve(&A_diag[3], &r3, &z3, LU_diag[3], 0);
561#if WITH_UMFPACK || WITH_SuperLU
569 void **LU_diag = precdata->
LU_diag;
572 const INT N0 = A_diag[0].
row;
573 const INT N1 = A_diag[1].
row;
574 const INT N2 = A_diag[2].
row;
575 const INT N = N0 + N1 + N2;
582 dvector r0, r1, r2, z0, z1, z2;
588 r0.
val = r; r1.
val = &(r[N0]); r2.
val = &(r[N0+N1]);
589 z0.
val = z; z1.
val = &(z[N0]); z2.
val = &(z[N0+N1]);
594 fasp_umfpack_solve(&A_diag[2], &r2, &z2, LU_diag[2], 0);
606 fasp_umfpack_solve(&A_diag[1], &r1, &z1, LU_diag[1], 0);
619 fasp_umfpack_solve(&A_diag[0], &r0, &z0, LU_diag[0], 0);
658 const INT N0 = A_diag[0].
row;
659 const INT N1 = A_diag[1].
row;
660 const INT N2 = A_diag[2].
row;
661 const INT N = N0 + N1 + N2;
670 dvector r0, r1, r2, z0, z1, z2;
676 r0.
val = r; r1.
val = &(r[N0]); r2.
val = &(r[N0+N1]);
677 z0.
val = z; z1.
val = &(z[N0]); z2.
val = &(z[N0+N1]);
729#if WITH_UMFPACK || WITH_SuperLU
737 void **LU_diag = precdata->
LU_diag;
740 const INT N0 = A_diag[0].
row;
741 const INT N1 = A_diag[1].
row;
742 const INT N2 = A_diag[2].
row;
743 const INT N = N0 + N1 + N2;
750 dvector r0, r1, r2, z0, z1, z2;
756 r0.
val = r; r1.
val = &(r[N0]); r2.
val = &(r[N0+N1]);
757 z0.
val = z; z1.
val = &(z[N0]); z2.
val = &(z[N0+N1]);
762 fasp_umfpack_solve(&A_diag[0], &r0, &z0, LU_diag[0], 0);
774 fasp_umfpack_solve(&A_diag[1], &r1, &z1, LU_diag[1], 0);
787 fasp_umfpack_solve(&A_diag[2], &r2, &z2, LU_diag[2], 0);
799 fasp_umfpack_solve(&A_diag[1], &r1, &z1, LU_diag[1], 0);
812 fasp_umfpack_solve(&A_diag[0], &r0, &z0, LU_diag[0], 0);
853 const INT N0 = A_diag[0].
row;
854 const INT N1 = A_diag[1].
row;
855 const INT N2 = A_diag[2].
row;
856 const INT N = N0 + N1 + N2;
863 dvector r0, r1, r2, z0, z1, z2;
869 r0.
val = r; r1.
val = &(r[N0]); r2.
val = &(r[N0+N1]);
870 z0.
val = z; z1.
val = &(z[N0]); z2.
val = &(z[N0+N1]);
943#if WITH_UMFPACK || WITH_SuperLU
954 void **local_LU = precdata->
local_LU;
958 REAL *w = precdata->
w;
971 for (l=0;l<NumLayers; l++) {
974 local_r[l].
val = r+N;
977 local_e[l].
val = z+N;
991 for (l=0; l<NumLayers-1; l++){
993 temp_r.
row = local_A[l].
row;
994 temp_e.
row = local_A[l].
row;
998 for (i=0; i<local_e[l].
row; i++){
999 temp_r.
val[local_index[l].
val[i]] = local_e[l].
val[i];
1004 fasp_umfpack_solve(&local_A[l], &temp_r, &temp_e, local_LU[l], 0);
1010 for (i=0; i<local_r[l].
row; i++){
1011 local_r[l].
val[i] = temp_e.
val[local_index[l].
val[i]];
1020 for (l=0; l<NumLayers; l++){
1022 temp_r.
row = local_A[l].
row;
1023 temp_e.
row = local_A[l].
row;
1027 for (i=0; i<local_e[l].
row; i++){
1028 temp_r.
val[local_index[l].
val[i]] = local_e[l].
val[i];
1033 fasp_umfpack_solve(&local_A[l], &temp_r, &temp_e, local_LU[l], 0);
1039 for (i=0; i<local_e[l].
row; i++) {
1040 local_e[l].
val[i] = temp_e.
val[local_index[l].
val[i]];
1046 for (l=NumLayers-2; l>=0; l--){
1048 temp_r.
row = local_A[l].
row;
1049 temp_e.
row = local_A[l].
row;
1055 for (i=0; i<local_r[l].
row; i++){
1056 temp_r.
val[local_index[l].
val[i]] = local_r[l].
val[i];
1061 fasp_umfpack_solve(&local_A[l], &temp_r, &temp_e, local_LU[l], 0);
1067 for (i=0; i<local_e[l].
row; i++){
1068 local_e[l].
val[i] = local_e[l].
val[i] - temp_e.
val[local_index[l].
val[i]];
void fasp_darray_set(const INT n, REAL *x, const REAL 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_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_dcsr_mxv(const dCSRmat *A, const REAL *x, REAL *y)
Matrix-vector multiplication y = A*x.
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_precond_dblc_upper_3(REAL *r, REAL *z, void *data)
block upper triangular preconditioning (3x3 blocks)
void fasp_precond_dblc_SGS_3(REAL *r, REAL *z, void *data)
Block symmetric GS preconditioning (3x3 blocks)
void fasp_precond_dblc_diag_4(REAL *r, REAL *z, void *data)
Block diagonal preconditioning (4x4 blocks)
void fasp_precond_dblc_lower_3(REAL *r, REAL *z, void *data)
block lower triangular preconditioning (3x3 blocks)
void fasp_precond_dblc_SGS_3_amg(REAL *r, REAL *z, void *data)
Block symmetric GS preconditioning (3x3 blocks)
void fasp_precond_dblc_diag_3_amg(REAL *r, REAL *z, void *data)
Block diagonal preconditioning (3x3 blocks)
void fasp_precond_dblc_lower_4(REAL *r, REAL *z, void *data)
block lower triangular preconditioning (4x4 blocks)
void fasp_precond_dblc_upper_3_amg(REAL *r, REAL *z, void *data)
block upper triangular preconditioning (3x3 blocks)
void fasp_precond_dblc_lower_3_amg(REAL *r, REAL *z, void *data)
block lower triangular preconditioning (3x3 blocks)
void fasp_precond_dblc_diag_3(REAL *r, REAL *z, void *data)
Block diagonal preconditioner (3x3 blocks)
void fasp_precond_dblc_sweeping(REAL *r, REAL *z, void *data)
Sweeping preconditioner for Maxwell equations.
void fasp_solver_mgcycle(AMG_data *mgl, AMG_param *param)
Solve Ax=b with non-recursive multigrid cycle.
int fasp_solver_superlu(dCSRmat *ptrA, dvector *b, dvector *u, const SHORT prtlvl)
Solve Au=b by SuperLU.
Main header file for the FASP project.
Header file for FASP block matrices.
dvector b
pointer to the right-hand side at level level_num
dvector x
pointer to the iterative solution at level level_num
Parameters for AMG methods.
Block REAL CSR matrix format.
dCSRmat ** blocks
blocks of dCSRmat, point to blocks[brow][bcol]
Sparse matrix of REAL type in CSR format.
INT col
column of matrix A, n
INT row
row number of matrix A, m
Vector with n entries of REAL type.
REAL * val
actual vector entries
Vector with n entries of INT type.
INT * val
actual vector entries
Data for block preconditioners in dBLCmat format.
Data for sweeping preconditioner.