xref: /petsc/src/mat/utils/compressedrow.c (revision 73e7a55880f7211d317aabb87c8bd5e70ea1847f)
1*73e7a558SHong Zhang 
2*73e7a558SHong Zhang #include "src/mat/impls/aij/seq/aij.h"
3*73e7a558SHong Zhang #undef __FUNCT__
4*73e7a558SHong Zhang #define __FUNCT__ "Mat_CheckCompressedRow"
5*73e7a558SHong Zhang /*@C
6*73e7a558SHong Zhang    Mat_CheckCompressedRow - Determines whether the compressed row matrix format should be used. If
7*73e7a558SHong Zhang                             the format is to be used, this routine creates Mat_CompressedRow struct.
8*73e7a558SHong Zhang 
9*73e7a558SHong Zhang                             Compressed row format provides high performance routines by
10*73e7a558SHong Zhang                             taking advantage of zero rows.
11*73e7a558SHong Zhang 
12*73e7a558SHong Zhang    Collective
13*73e7a558SHong Zhang 
14*73e7a558SHong Zhang    Input Parameters:
15*73e7a558SHong Zhang +  A             - the matrix
16*73e7a558SHong Zhang .  compressedrow - pointer to the struct Mat_CompressedRow
17*73e7a558SHong Zhang .  ai            - row pointer used by seqaij and seqbaij
18*73e7a558SHong Zhang -  ratio         - ratio of (num of zero rows)/m, used to determine if the compressed row format should be used
19*73e7a558SHong Zhang 
20*73e7a558SHong Zhang    Level: developer
21*73e7a558SHong Zhang @*/
22*73e7a558SHong Zhang PetscErrorCode Mat_CheckCompressedRow(Mat A,Mat_CompressedRow *compressedrow,PetscInt *ai,PetscReal ratio)
23*73e7a558SHong Zhang {
24*73e7a558SHong Zhang   PetscErrorCode ierr;
25*73e7a558SHong Zhang   PetscInt       nrows,*cpi=PETSC_NULL,*rindex=PETSC_NULL,nz,i,row,m=A->m;
26*73e7a558SHong Zhang 
27*73e7a558SHong Zhang   PetscFunctionBegin;
28*73e7a558SHong Zhang   compressedrow->checked = PETSC_TRUE;
29*73e7a558SHong Zhang 
30*73e7a558SHong Zhang   /* compute number of zero rows */
31*73e7a558SHong Zhang   nrows = 0;
32*73e7a558SHong Zhang   for (i=0; i<m; i++){                /* for each row */
33*73e7a558SHong Zhang     nz = ai[i+1] - ai[i];       /* number of nonzeros */
34*73e7a558SHong Zhang     if (nz == 0) nrows++;
35*73e7a558SHong Zhang   }
36*73e7a558SHong Zhang 
37*73e7a558SHong Zhang   /* if enough zero rows are found, use compressedrow data structure */
38*73e7a558SHong Zhang   if (nrows < ratio*m) {
39*73e7a558SHong Zhang     compressedrow->use = PETSC_FALSE;
40*73e7a558SHong Zhang   } else {
41*73e7a558SHong Zhang     compressedrow->use = PETSC_TRUE;
42*73e7a558SHong Zhang     PetscLogInfo(A,"Mat_CheckCompressedRow: Found the ratio (num_zerorows %d)/(num_localrows %d) > %g. Use CompressedRow routines.\n",nrows,m,ratio);
43*73e7a558SHong Zhang 
44*73e7a558SHong Zhang     /* set compressed row format */
45*73e7a558SHong Zhang     nrows = m - nrows; /* num of non-zero rows */
46*73e7a558SHong Zhang     ierr = PetscMalloc((2*nrows+1)*sizeof(PetscInt),&cpi);CHKERRQ(ierr);
47*73e7a558SHong Zhang     rindex = cpi + nrows + 1;
48*73e7a558SHong Zhang     row    = 0;
49*73e7a558SHong Zhang     cpi[0] = 0;
50*73e7a558SHong Zhang     for (i=0; i<m; i++){
51*73e7a558SHong Zhang       nz = ai[i+1] - ai[i];
52*73e7a558SHong Zhang       if (nz == 0) continue;
53*73e7a558SHong Zhang       cpi[row+1]    = ai[i+1];    /* compressed row pointer */
54*73e7a558SHong Zhang       rindex[row++] = i;          /* compressed row local index */
55*73e7a558SHong Zhang     }
56*73e7a558SHong Zhang     compressedrow->nrows  = nrows;
57*73e7a558SHong Zhang     compressedrow->i      = cpi;
58*73e7a558SHong Zhang     compressedrow->rindex = rindex;
59*73e7a558SHong Zhang   }
60*73e7a558SHong Zhang   PetscFunctionReturn(0);
61*73e7a558SHong Zhang }
62