18#include "fasp_functs.h"
57 INT inroot = -10, nsizei = -10, nsizeall = -10, nlvl = 0;
63 INT *iblock = NULL, *jblock = NULL, *mask = NULL, *maxa = NULL;
71 printf(
"### DEBUG: [-Begin-] %s ...\n", __FUNCTION__);
81 memset(mask, 0,
sizeof(
INT) * n);
82 memset(iblock, 0,
sizeof(
INT) * n);
83 memset(maxa, 0,
sizeof(
INT) * n);
95 for (i = 0; i < MIS.
row; i++) {
97 SWZ_level(inroot, &A, mask, &nlvl, maxa, jblock, maxlev);
103 printf(
"### DEBUG: nsizeall = %d\n", nsizeall);
114 for (i = 0; i < MIS.
row; i++) {
116 SWZ_level(inroot, &A, mask, &nlvl, maxa, jb, maxlev);
118 iblock[i + 1] = iblock[i] + nsizei;
125 printf(
"### DEBUG: nsizeall = %d, %d\n", nsizeall, iblock[nblk]);
132 memset(mask, 0,
sizeof(
INT) * n);
136 SWZ_block(swzdata, nblk, iblock, jblock, mask);
148 for (i = 0; i < nblk; ++i)
149 mumps[i] = fasp_mumps_factorize(&blk[i], NULL, NULL,
PRINT_NONE);
150 swzdata->
mumps = mumps;
163 for (i = 0; i < nblk; ++i) {
167 numeric[i] = fasp_umfpack_factorize(&blk[i], 0);
169 swzdata->numeric = numeric;
183 printf(
"### DEBUG: n = %d, #blocks = %d, max block size = %d\n", n, nblk,
190 swzdata->
nblk = nblk;
193 swzdata->
mask = mask;
194 swzdata->
maxa = maxa;
198 printf(
"### DEBUG: [--End--] %s ...\n", __FUNCTION__);
221 INT i, j, iblk, ki, kj, kij, is, ibl0, ibl1, nloc, iaa, iab;
242 void** numeric = swzdata->numeric;
249 for (is = 0; is < nblk; ++is) {
252 ibl1 = iblock[is + 1];
254 for (i = 0; i < nloc; ++i) {
260 for (i = 0; i < nloc; ++i) {
265 iab = ia[ki + 1] - 1;
266 for (kij = iaa; kij < iab; ++kij) {
270 rhs.
val[i] -= val[kij] * x->
val[kj];
282 fasp_mumps_solve(&blk[is], &rhs, &u, mumps[is], 0);
291 fasp_umfpack_solve(&blk[is], &rhs, &u, numeric[is], 0);
305 for (i = 0; i < nloc; ++i) {
331 INT i, j, iblk, ki, kj, kij, is, ibl0, ibl1, nloc, iaa, iab;
352 void** numeric = swzdata->numeric;
359 for (is = nblk - 1; is >= 0; --is) {
362 ibl1 = iblock[is + 1];
364 for (i = 0; i < nloc; ++i) {
370 for (i = 0; i < nloc; ++i) {
375 iab = ia[ki + 1] - 1;
376 for (kij = iaa; kij < iab; ++kij) {
380 rhs.
val[i] -= val[kij] * x->
val[kj];
392 fasp_mumps_solve(&blk[is], &rhs, &u, mumps[is], 0);
401 fasp_umfpack_solve(&blk[is], &rhs, &u, numeric[is], 0);
415 for (i = 0; i < nloc; ++i) {
446 INT* jblock,
const INT maxlev)
451 INT i, j, lvl, lbegin, lvlend, nsize, node;
452 INT jstrt, jstop, nbr, lvsize;
455 if (ia[inroot + 1] - ia[inroot] <= 1) {
458 jblock[iblock[lvl]] = inroot;
473 while (lvsize > 0 && lvl < maxlev) {
476 iblock[lvl] = lbegin;
478 for (i = lbegin; i < lvlend; ++i) {
480 jstrt = ia[node] - 1;
481 jstop = ia[node + 1] - 1;
482 for (j = jstrt; j < jstop; ++j) {
484 if (mask[nbr] == 0) {
491 lvsize = nsize - lvlend;
497 for (i = 0; i < nsize; ++i) {
521static void SWZ_block(
SWZ_data* swzdata,
const INT nblk,
const INT* iblock,
522 const INT* jblock,
INT* mask)
524 INT i, j, iblk, ki, kj, kij, is, ibl0, ibl1, nloc, iaa, iab;
525 INT maxbs = 0, count, nnz;
535 for (is = 0; is < nblk; ++is) {
537 ibl1 = iblock[is + 1];
539 maxbs =
MAX(maxbs, nloc);
542 swzdata->
maxbs = maxbs;
548 for (is = 0; is < nblk; ++is) {
550 ibl1 = iblock[is + 1];
553 for (i = 0; i < nloc; ++i) {
557 iab = ia[ki + 1] - 1;
566 for (i = 0; i < nloc; ++i) {
570 iab = ia[ki + 1] - 1;
571 for (kij = iaa; kij < iab; ++kij) {
575 blk[is].
JA[nnz] = j - 1;
576 blk[is].
val[nnz] = val[kij];
580 blk[is].
IA[i + 1] = nnz;
586 for (i = 0; i < nloc; ++i) {
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.
dvector fasp_dvec_create(const INT m)
Create dvector data space of REAL type.
void fasp_dvec_set(INT n, dvector *x, const REAL val)
Initialize dvector x[i]=val for i=0:n-1.
INT fasp_swz_dcsr_setup(SWZ_data *swzdata, SWZ_param *swzparam)
Setup phase for the Schwarz methods.
void fasp_dcsr_swz_forward(SWZ_data *swzdata, SWZ_param *swzparam, dvector *x, dvector *b)
Schwarz smoother: forward sweep.
void fasp_dcsr_swz_backward(SWZ_data *swzdata, SWZ_param *swzparam, dvector *x, dvector *b)
Schwarz smoother: backward sweep.
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_transz(dCSRmat *A, INT *p, dCSRmat *AT)
Generalized transpose of A: (n x m) matrix given in dCSRmat format.
void fasp_dcsr_cp(const dCSRmat *A, dCSRmat *B)
copy a dCSRmat to a new one B=A
ivector fasp_sparse_mis(dCSRmat *A)
Get the maximal independet set of a CSR matrix.
INT fasp_solver_dcsr_pvgmres(dCSRmat *A, dvector *b, dvector *x, precond *pc, const REAL tol, const REAL abstol, const INT MaxIt, const SHORT restart, const SHORT StopType, const SHORT PrtLvl)
Right preconditioned GMRES method in which the restart parameter can be adaptively modified during it...
Main header file for the FASP project.
#define MAX(a, b)
Definition of max, min, abs.
#define FASP_SUCCESS
Definition of return status and error messages.
#define PRINT_NONE
Print level for all subroutines – not including DEBUG output.
Data for MUMPS interface.
Data for Schwarz methods.
INT maxbs
maximal block size
dCSRmat A
pointer to the original coefficient matrix
dvector rhsloc1
local right hand side
dvector xloc1
local solution
SWZ_param * swzparam
param for Schwarz
dCSRmat * blk_data
matrix for each partition
INT SWZ_type
Schwarz method type.
INT * jblock
column index of blocks
Mumps_data * mumps
param for MUMPS
INT * iblock
row index of blocks
Parameters for Schwarz method.
INT SWZ_maxlvl
maximal level for constructing the blocks
INT SWZ_blksolver
type of Schwarz block solver
SHORT SWZ_type
type for Schwarz method
Sparse matrix of REAL type in CSR format.
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
Vector with n entries of INT type.
INT * val
actual vector entries