Fast Auxiliary Space Preconditioning 2.7.7 Aug/28/2022
Loading...
Searching...
No Matches
PreAMGSetupRS.c
Go to the documentation of this file.
1
21#include <time.h>
22
23#ifdef _OPENMP
24#include <omp.h>
25#endif
26
27#include "fasp.h"
28#include "fasp_functs.h"
29
30/*---------------------------------*/
31/*-- Public Functions --*/
32/*---------------------------------*/
33
53 AMG_param *param)
54{
55 const SHORT prtlvl = param->print_level;
56 const SHORT cycle_type = param->cycle_type;
57 const SHORT csolver = param->coarse_solver;
58 const INT min_cdof = MAX(param->coarse_dof,MIN_CDOF);
59 const INT m = mgl[0].A.row;
60
61 // local variables
62 SHORT status = FASP_SUCCESS;
63 INT lvl = 0, max_lvls = param->max_levels;
64 REAL setup_start, setup_end;
65 ILU_param iluparam;
66 SWZ_param swzparam;
67 iCSRmat Scouple; // strong n-couplings
68
69 // level info (fine: 0; coarse: 1)
70 ivector vertices = fasp_ivec_create(m);
71
72 // Output some info for debugging
73 if ( prtlvl > PRINT_NONE ) printf("\nSetting up Classical AMG ...\n");
74
75#if DEBUG_MODE > 0
76 printf("### DEBUG: [-Begin-] %s ...\n", __FUNCTION__);
77 printf("### DEBUG: n = %d, nnz = %d\n", mgl[0].A.row, mgl[0].A.nnz);
78#endif
79
80 fasp_gettime(&setup_start);
81
82 // Make sure classical AMG will not call fasp_blas_dcsr_mxv_agg!
83 param->tentative_smooth = 1.0;
84
85 // If user want to use aggressive coarsening but did not specify number of
86 // levels use aggressive coarsening, make sure apply aggressive coarsening
87 // on the finest level only !!!
88 if ( param->coarsening_type == COARSE_AC ) {
89 param->aggressive_level = MAX(param->aggressive_level, 1);
90 }
91
92 // Initialize AMLI coefficients
93 if ( cycle_type == AMLI_CYCLE ) {
94 const INT amlideg = param->amli_degree;
95 param->amli_coef = (REAL *)fasp_mem_calloc(amlideg+1,sizeof(REAL));
96 fasp_amg_amli_coef(2.0, 0.5, amlideg, param->amli_coef);
97 }
98
99 // Initialize ILU parameters
100 mgl->ILU_levels = param->ILU_levels;
101 if ( param->ILU_levels > 0 ) {
102 iluparam.print_level = param->print_level;
103 iluparam.ILU_lfil = param->ILU_lfil;
104 iluparam.ILU_droptol = param->ILU_droptol;
105 iluparam.ILU_relax = param->ILU_relax;
106 iluparam.ILU_type = param->ILU_type;
107 }
108
109 // Initialize Schwarz parameters
110 mgl->SWZ_levels = param->SWZ_levels;
111 if ( param->SWZ_levels > 0 ) {
112 swzparam.SWZ_mmsize = param->SWZ_mmsize;
113 swzparam.SWZ_maxlvl = param->SWZ_maxlvl;
114 swzparam.SWZ_type = param->SWZ_type;
115 swzparam.SWZ_blksolver = param->SWZ_blksolver;
116 }
117
118#if DIAGONAL_PREF
119 // Reorder each row to keep the diagonal entries appear first !!!
120 fasp_dcsr_diagpref(&mgl[0].A);
121#endif
122
123 // Main AMG setup loop
124 while ( (mgl[lvl].A.row > min_cdof) && (lvl < max_lvls-1) ) {
125
126#if DEBUG_MODE > 1
127 printf("### DEBUG: level = %d, row = %d, nnz = %d\n",
128 lvl, mgl[lvl].A.row, mgl[lvl].A.nnz);
129#endif
130
131 /*-- Setup ILU decomposition if needed --*/
132 if ( lvl < param->ILU_levels ) {
133 status = fasp_ilu_dcsr_setup(&mgl[lvl].A, &mgl[lvl].LU, &iluparam);
134 if ( status < 0 ) {
135 if ( prtlvl > PRINT_MIN ) {
136 printf("### WARNING: ILU setup on level-%d failed!\n", lvl);
137 printf("### WARNING: Disable ILU for level >= %d.\n", lvl);
138 }
139 param->ILU_levels = lvl;
140 }
141 }
142
143 /*-- Setup Schwarz smoother if needed --*/
144 if ( lvl < param->SWZ_levels ) {
145 mgl[lvl].Schwarz.A = fasp_dcsr_sympart(&mgl[lvl].A);
146 fasp_dcsr_shift(&(mgl[lvl].Schwarz.A), 1);
147 status = fasp_swz_dcsr_setup(&mgl[lvl].Schwarz, &swzparam);
148 if ( status < 0 ) {
149 if ( prtlvl > PRINT_MIN ) {
150 printf("### WARNING: Schwarz on level-%d failed!\n", lvl);
151 printf("### WARNING: Disable Schwarz for level >= %d.\n", lvl);
152 }
153 param->SWZ_levels = lvl;
154 }
155 }
156
157 /*-- Coarsening and form the structure of interpolation --*/
158 status = fasp_amg_coarsening_rs(&mgl[lvl].A, &vertices, &mgl[lvl].P,
159 &Scouple, param);
160
161 // Check 1: Did coarsening step succeeded?
162 if ( status < 0 ) {
163 /*-- Clean up Scouple generated in coarsening --*/
164 fasp_mem_free(Scouple.IA); Scouple.IA = NULL;
165 fasp_mem_free(Scouple.JA); Scouple.JA = NULL;
166
167 // When error happens, stop at the current multigrid level!
168 if ( prtlvl > PRINT_MIN ) {
169 printf("### WARNING: Could not find any C-variables!\n");
170 printf("### WARNING: Stop coarsening on level=%d!\n", lvl);
171 }
172 status = FASP_SUCCESS; break;
173 }
174
175 // Check 2: Is coarse sparse too small?
176 if ( mgl[lvl].P.col < MIN_CDOF ) {
177 /*-- Clean up Scouple generated in coarsening --*/
178 fasp_mem_free(Scouple.IA); Scouple.IA = NULL;
179 fasp_mem_free(Scouple.JA); Scouple.JA = NULL;
180 break;
181 }
182
183 // Check 3: Does this coarsening step too aggressive?
184 if ( mgl[lvl].P.row > mgl[lvl].P.col * 10.0 ) {
185 if ( prtlvl > PRINT_MIN ) {
186 printf("### WARNING: Coarsening might be too aggressive!\n");
187 printf("### WARNING: Fine level = %d, coarse level = %d. Discard!\n",
188 mgl[lvl].P.row, mgl[lvl].P.col);
189 }
190
191 /*-- Clean up Scouple generated in coarsening --*/
192 fasp_mem_free(Scouple.IA); Scouple.IA = NULL;
193 fasp_mem_free(Scouple.JA); Scouple.JA = NULL;
194 break;
195 }
196
197 /*-- Perform aggressive coarsening only up to the specified level --*/
198 if ( mgl[lvl].P.col*1.5 > mgl[lvl].A.row ) param->coarsening_type = COARSE_RS;
199 if ( lvl == param->aggressive_level ) param->coarsening_type = COARSE_RS;
200
201 /*-- Store the C/F marker --*/
202 {
203 INT size = mgl[lvl].A.row;
204 mgl[lvl].cfmark = fasp_ivec_create(size);
205 memcpy(mgl[lvl].cfmark.val, vertices.val, size*sizeof(INT));
206 }
207
208 /*-- Form interpolation --*/
209 fasp_amg_interp(&mgl[lvl].A, &vertices, &mgl[lvl].P, &Scouple, param);
210
211 /*-- Form coarse level matrix: two RAP routines available! --*/
212 fasp_dcsr_trans(&mgl[lvl].P, &mgl[lvl].R);
213
214 fasp_blas_dcsr_rap(&mgl[lvl].R, &mgl[lvl].A, &mgl[lvl].P, &mgl[lvl+1].A);
215
216 // ##DEBUG: check value of interpolation matrix with rdc-amg
217 // fasp_dcsr_print(&mgl[lvl+1].A);
218 // do Reduction-based interpolation (debug)
219 // dCSRmat Ptmp;
220 // INT interptmp = param->interpolation_type;
221 // param->interpolation_type = INTERP_RDC;
222 // fasp_amg_coarsening_rs(&mgl[lvl].A, &vertices, &Ptmp,
223 // &Scouple, param);
224 // // param->theta = 1.0;
225 // printf("## DEBUG: theta = %f\n", param->theta);
226 // fasp_amg_interp(&mgl[lvl].A, &vertices, &Ptmp,
227 // &Scouple, param);
228 // // compare Ptmp and mgl[lvl].P
229 // printf("Ptmp: %d x %d, mgl[lvl].P: %d x %d\n",
230 // Ptmp.row, Ptmp.col, mgl[lvl].P.row, mgl[lvl].P.col);
231 // printf("Ptmp: %d, mgl[lvl].P: %d\n", Ptmp.nnz, mgl[lvl].P.nnz);
232 // double sumDiff = 0.0;
233 // for (int i=0; i<Ptmp.row; ++i) {
234 // for (int j=Ptmp.IA[i]; j<Ptmp.IA[i+1]; ++j) {
235 // // check if Ptmp.val[i] == mgl[lvl].P.val[i]
236 // if ( fabs(Ptmp.val[j] - mgl[lvl].P.val[j] ) > 1e-8 ) {
237 // printf("Ptmp[%d,%d] = %f, mgl[%d,%d] = %f\n",
238 // i, Ptmp.JA[j], Ptmp.val[j], i, mgl[lvl].P.JA[j], mgl[lvl].P.val[j]);
239 // }
240 // else {
241 // sumDiff += fabs(Ptmp.val[j] - mgl[lvl].P.val[j]);
242 // }
243 // }
244 // }
245 // printf("sumDiff = %f\n", sumDiff);
246 // fasp_dcsr_free(&Ptmp);
247 // param->interpolation_type = interptmp;
248
249 /*-- Clean up Scouple generated in coarsening --*/
250 fasp_mem_free(Scouple.IA); Scouple.IA = NULL;
251 fasp_mem_free(Scouple.JA); Scouple.JA = NULL;
252
253 ++lvl;
254
255#if DIAGONAL_PREF
256 // reorder each row to make diagonal appear first
257 fasp_dcsr_diagpref(&mgl[lvl].A);
258#endif
259
260 // Check 4: Is the coarse matrix too dense?
261 if ( mgl[lvl].A.nnz / mgl[lvl].A.row > mgl[lvl].A.col * 0.2 ) {
262 if ( prtlvl > PRINT_MIN ) {
263 printf("### WARNING: Coarse matrix is too dense!\n");
264 printf("### WARNING: m = n = %d, nnz = %d!\n",
265 mgl[lvl].A.col, mgl[lvl].A.nnz);
266 }
267
268 break;
269 }
270
271 } // end of the main while loop
272
273 // Setup coarse level systems for direct solvers
274 switch (csolver) {
275
276#if WITH_MUMPS
277 case SOLVER_MUMPS: {
278 // Setup MUMPS direct solver on the coarsest level
279 mgl[lvl].mumps.job = 1;
280 fasp_solver_mumps_steps(&mgl[lvl].A, &mgl[lvl].b, &mgl[lvl].x, &mgl[lvl].mumps);
281 break;
282 }
283#endif
284
285#if WITH_UMFPACK
286 case SOLVER_UMFPACK: {
287 // Need to sort the matrix A for UMFPACK to work
288 dCSRmat Ac_tran;
289 Ac_tran = fasp_dcsr_create(mgl[lvl].A.row, mgl[lvl].A.col, mgl[lvl].A.nnz);
290 fasp_dcsr_transz(&mgl[lvl].A, NULL, &Ac_tran);
291 // It is equivalent to do transpose and then sort
292 // fasp_dcsr_trans(&mgl[lvl].A, &Ac_tran);
293 // fasp_dcsr_sort(&Ac_tran);
294 fasp_dcsr_cp(&Ac_tran, &mgl[lvl].A);
295 fasp_dcsr_free(&Ac_tran);
296 mgl[lvl].Numeric = fasp_umfpack_factorize(&mgl[lvl].A, 0);
297 break;
298 }
299#endif
300
301#if WITH_PARDISO
302 case SOLVER_PARDISO: {
303 fasp_dcsr_sort(&mgl[lvl].A);
304 fasp_pardiso_factorize(&mgl[lvl].A, &mgl[lvl].pdata, prtlvl);
305 break;
306 }
307#endif
308
309 default:
310 // Do nothing!
311 break;
312 }
313
314 // setup total level number and current level
315 mgl[0].num_levels = max_lvls = lvl+1;
316 mgl[0].w = fasp_dvec_create(m);
317
318 for ( lvl = 1; lvl < max_lvls; ++lvl ) {
319 const INT mm = mgl[lvl].A.row;
320
321 mgl[lvl].num_levels = max_lvls;
322 mgl[lvl].b = fasp_dvec_create(mm);
323 mgl[lvl].x = fasp_dvec_create(mm);
324
325 mgl[lvl].cycle_type = cycle_type; // initialize cycle type!
326 mgl[lvl].ILU_levels = param->ILU_levels - lvl; // initialize ILU levels!
327 mgl[lvl].SWZ_levels = param->SWZ_levels - lvl; // initialize Schwarz!
328
329 // allocate work arrays for the solve phase
330 if ( cycle_type == NL_AMLI_CYCLE )
331 mgl[lvl].w = fasp_dvec_create(3*mm);
332 else
333 mgl[lvl].w = fasp_dvec_create(2*mm);
334 }
335
336 fasp_ivec_free(&vertices);
337
338#if MULTI_COLOR_ORDER
339 INT Colors,rowmax;
340#ifdef _OPENMP
341 int threads = fasp_get_num_threads();
342 if (threads > max_lvls-1 ) threads = max_lvls-1;
343#pragma omp parallel for private(lvl,rowmax,Colors) schedule(static, 1) num_threads(threads)
344#endif
345 for (lvl=0; lvl<max_lvls-1; lvl++){
346
347#if 1
348 dCSRmat_Multicoloring(&mgl[lvl].A, &rowmax, &Colors);
349#else
350 dCSRmat_Multicoloring_Theta(&mgl[lvl].A, mgl[lvl].GS_Theta, &rowmax, &Colors);
351#endif
352 if ( prtlvl > 1 )
353 printf("mgl[%3d].A.row = %12d, rowmax = %5d, rowavg = %7.2lf, colors = %5d, Theta = %le.\n",
354 lvl, mgl[lvl].A.row, rowmax, (double)mgl[lvl].A.nnz/mgl[lvl].A.row,
355 mgl[lvl].A.color, mgl[lvl].GS_Theta);
356 }
357#endif
358
359 if ( prtlvl > PRINT_NONE ) {
360 fasp_gettime(&setup_end);
361 fasp_amgcomplexity(mgl, prtlvl);
362 fasp_cputime("Classical AMG setup", setup_end - setup_start);
363 }
364
365#if DEBUG_MODE > 0
366 printf("### DEBUG: [--End--] %s ...\n", __FUNCTION__);
367#endif
368
369 return status;
370}
371
372/*---------------------------------*/
373/*-- End of File --*/
374/*---------------------------------*/
375
void fasp_mem_free(void *mem)
Free up previous allocated memory body and set pointer to NULL.
Definition: AuxMemory.c:152
void * fasp_mem_calloc(const unsigned int size, const unsigned int type)
Allocate, initiate, and check memory.
Definition: AuxMemory.c:65
void fasp_cputime(const char *message, const REAL cputime)
Print CPU walltime.
Definition: AuxMessage.c:179
void fasp_amgcomplexity(const AMG_data *mgl, const SHORT prtlvl)
Print level and complexity information of AMG.
Definition: AuxMessage.c:84
void fasp_gettime(REAL *time)
Get system time.
Definition: AuxTiming.c:37
void fasp_ivec_free(ivector *u)
Free vector data space of INT type.
Definition: AuxVector.c:164
dvector fasp_dvec_create(const INT m)
Create dvector data space of REAL type.
Definition: AuxVector.c:62
ivector fasp_ivec_create(const INT m)
Create vector data space of INT type.
Definition: AuxVector.c:84
SHORT fasp_ilu_dcsr_setup(dCSRmat *A, ILU_data *iludata, ILU_param *iluparam)
Get ILU decomposition of a CSR matrix A.
INT fasp_swz_dcsr_setup(SWZ_data *swzdata, SWZ_param *swzparam)
Setup phase for the Schwarz methods.
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...
Definition: BlaSparseCSR.c:680
dCSRmat fasp_dcsr_create(const INT m, const INT n, const INT nnz)
Create CSR sparse matrix data memory space.
Definition: BlaSparseCSR.c:47
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 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.
void fasp_dcsr_free(dCSRmat *A)
Free CSR sparse matrix data memory space.
Definition: BlaSparseCSR.c:184
void fasp_dcsr_transz(dCSRmat *A, INT *p, dCSRmat *AT)
Generalized transpose of A: (n x m) matrix given in dCSRmat format.
void fasp_dcsr_sort(dCSRmat *A)
Sort each row of A in ascending order w.r.t. column indices.
Definition: BlaSparseCSR.c:385
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
Definition: BlaSparseCSR.c:851
dCSRmat fasp_dcsr_sympart(dCSRmat *A)
Get symmetric part of a dCSRmat matrix.
INT fasp_dcsr_trans(const dCSRmat *A, dCSRmat *AT)
Find transpose of dCSRmat matrix A.
Definition: BlaSparseCSR.c:952
void fasp_blas_dcsr_rap(const dCSRmat *R, const dCSRmat *A, const dCSRmat *P, dCSRmat *RAP)
Triple sparse matrix multiplication B=R*A*P.
Definition: BlaSpmvCSR.c:999
SHORT fasp_amg_coarsening_rs(dCSRmat *A, ivector *vertices, dCSRmat *P, iCSRmat *S, AMG_param *param)
Standard and aggressive coarsening schemes.
void fasp_amg_interp(dCSRmat *A, ivector *vertices, dCSRmat *P, iCSRmat *S, AMG_param *param)
Generate interpolation operator P.
Definition: PreAMGInterp.c:64
SHORT fasp_amg_setup_rs(AMG_data *mgl, AMG_param *param)
Setup phase of Ruge and Stuben's classic AMG.
Definition: PreAMGSetupRS.c:52
void fasp_amg_amli_coef(const REAL lambda_max, const REAL lambda_min, const INT degree, REAL *coef)
Compute the coefficients of the polynomial used by AMLI-cycle.
int fasp_solver_mumps_steps(dCSRmat *ptrA, dvector *b, dvector *u, Mumps_data *mumps)
Solve Ax=b by MUMPS in three steps.
Definition: XtrMumps.c:196
Main header file for the FASP project.
#define REAL
Definition: fasp.h:75
#define SHORT
FASP integer and floating point numbers.
Definition: fasp.h:71
#define MAX(a, b)
Definition of max, min, abs.
Definition: fasp.h:82
#define INT
Definition: fasp.h:72
#define AMLI_CYCLE
Definition: fasp_const.h:181
#define COARSE_RS
Definition of coarsening types.
Definition: fasp_const.h:213
#define SOLVER_PARDISO
Definition: fasp_const.h:126
#define NL_AMLI_CYCLE
Definition: fasp_const.h:182
#define FASP_SUCCESS
Definition of return status and error messages.
Definition: fasp_const.h:19
#define SOLVER_MUMPS
Definition: fasp_const.h:125
#define COARSE_AC
Definition: fasp_const.h:216
#define SOLVER_UMFPACK
Definition: fasp_const.h:124
#define PRINT_NONE
Print level for all subroutines – not including DEBUG output.
Definition: fasp_const.h:73
#define MIN_CDOF
Definition: fasp_const.h:260
#define PRINT_MIN
Definition: fasp_const.h:74
Data for AMG methods.
Definition: fasp.h:804
dCSRmat A
pointer to the matrix at level level_num
Definition: fasp.h:817
INT cycle_type
cycle type
Definition: fasp.h:869
Mumps_data mumps
data for MUMPS
Definition: fasp.h:866
dCSRmat P
prolongation operator at level level_num
Definition: fasp.h:823
SWZ_data Schwarz
data of Schwarz smoother
Definition: fasp.h:860
dvector b
pointer to the right-hand side at level level_num
Definition: fasp.h:826
void * Numeric
pointer to the numerical factorization from UMFPACK
Definition: fasp.h:834
INT ILU_levels
number of levels use ILU smoother
Definition: fasp.h:843
INT SWZ_levels
number of levels use Schwarz smoother
Definition: fasp.h:857
dvector x
pointer to the iterative solution at level level_num
Definition: fasp.h:829
SHORT num_levels
number of levels in use <= max_levels
Definition: fasp.h:812
dvector w
temporary work space
Definition: fasp.h:863
ivector cfmark
pointer to the CF marker at level level_num
Definition: fasp.h:840
Parameters for AMG methods.
Definition: fasp.h:455
INT ILU_lfil
level of fill-in for ILUs and ILUk
Definition: fasp.h:566
INT aggressive_level
number of levels use aggressive coarsening
Definition: fasp.h:536
REAL ILU_relax
relaxation for ILUs
Definition: fasp.h:572
INT SWZ_mmsize
maximal block size
Definition: fasp.h:581
SHORT print_level
print level for AMG
Definition: fasp.h:461
INT SWZ_maxlvl
maximal levels
Definition: fasp.h:584
SHORT coarsening_type
coarsening type
Definition: fasp.h:515
REAL * amli_coef
coefficients of the polynomial used by AMLI cycle
Definition: fasp.h:509
SHORT ILU_levels
number of levels use ILU smoother
Definition: fasp.h:560
SHORT coarse_solver
coarse solver type
Definition: fasp.h:500
SHORT cycle_type
type of AMG cycle
Definition: fasp.h:476
SHORT amli_degree
degree of the polynomial used by AMLI cycle
Definition: fasp.h:506
SHORT ILU_type
ILU type for smoothing.
Definition: fasp.h:563
INT SWZ_blksolver
type of Schwarz block solver
Definition: fasp.h:590
INT SWZ_type
type of Schwarz method
Definition: fasp.h:587
INT coarse_dof
max number of coarsest level DOF
Definition: fasp.h:473
REAL ILU_droptol
drop tolerance for ILUt
Definition: fasp.h:569
REAL tentative_smooth
relaxation parameter for smoothing the tentative prolongation
Definition: fasp.h:551
INT SWZ_levels
number of levels use Schwarz smoother
Definition: fasp.h:578
SHORT max_levels
max number of levels of AMG
Definition: fasp.h:470
Parameters for ILU.
Definition: fasp.h:404
INT ILU_lfil
level of fill-in for ILUk
Definition: fasp.h:413
REAL ILU_relax
add the sum of dropped elements to diagonal element in proportion relax
Definition: fasp.h:419
SHORT print_level
print level
Definition: fasp.h:407
SHORT ILU_type
ILU type for decomposition.
Definition: fasp.h:410
REAL ILU_droptol
drop tolerance for ILUt
Definition: fasp.h:416
INT job
work for MUMPS
Definition: fasp.h:615
dCSRmat A
pointer to the original coefficient matrix
Definition: fasp.h:731
Parameters for Schwarz method.
Definition: fasp.h:430
INT SWZ_mmsize
maximal size of blocks
Definition: fasp.h:442
INT SWZ_maxlvl
maximal level for constructing the blocks
Definition: fasp.h:439
INT SWZ_blksolver
type of Schwarz block solver
Definition: fasp.h:445
SHORT SWZ_type
type for Schwarz method
Definition: fasp.h:436
Sparse matrix of REAL type in CSR format.
Definition: fasp.h:151
INT col
column of matrix A, n
Definition: fasp.h:157
INT row
row number of matrix A, m
Definition: fasp.h:154
INT nnz
number of nonzero entries
Definition: fasp.h:160
Sparse matrix of INT type in CSR format.
Definition: fasp.h:190
INT * IA
integer array of row pointers, the size is m+1
Definition: fasp.h:202
INT * JA
integer array of column indexes, the size is nnz
Definition: fasp.h:205
Vector with n entries of INT type.
Definition: fasp.h:368
INT * val
actual vector entries
Definition: fasp.h:374