xref: /petsc/src/mat/utils/compressedrow.c (revision 2ef1f0ff6e3530e8731eb06ad663081f5844f49f)
1af0996ceSBarry Smith #include <petsc/private/matimpl.h> /*I   "petscmat.h"  I*/
226e093fcSHong Zhang 
373e7a558SHong Zhang /*@C
4cd6b891eSBarry Smith    MatCheckCompressedRow - Determines whether the compressed row matrix format should be used.
5f38b99b6SHong Zhang       If the format is to be used, this routine creates Mat_CompressedRow struct.
6f38b99b6SHong Zhang       Compressed row format provides high performance routines by taking advantage of zero rows.
7*2ef1f0ffSBarry Smith       Supported types are `MATAIJ`, `MATBAIJ` and `MATSBAIJ`.
873e7a558SHong Zhang 
973e7a558SHong Zhang    Collective
1073e7a558SHong Zhang 
1173e7a558SHong Zhang    Input Parameters:
1273e7a558SHong Zhang +  A             - the matrix
1311e456e1SBarry Smith .  nrows         - number of rows with nonzero entries
1473e7a558SHong Zhang .  compressedrow - pointer to the struct Mat_CompressedRow
15*2ef1f0ffSBarry Smith .  ai            - row pointer used by `MATSEQAIJ` and `MATSEQBAIJ`
16*2ef1f0ffSBarry Smith .  mbs           - number of (block) rows represented by `ai`
1773e7a558SHong Zhang -  ratio         - ratio of (num of zero rows)/m, used to determine if the compressed row format should be used
1873e7a558SHong Zhang 
19*2ef1f0ffSBarry Smith    Developer Note: The reason this takes the compressedrow, ai and mbs arguments is because it is called by both the `MATSEQAIJ` and `MATSEQBAIJ` matrices and
20340b11eeSBarry Smith                    the values are not therefore obtained by directly taking the values from the matrix object.
218aea9937SBarry Smith                    This is not a general public routine and hence is not listed in petscmat.h (it exposes a private data structure) but it is used
228aea9937SBarry Smith                    by some preconditioners and hence is labeled as PETSC_EXTERN
238aea9937SBarry Smith 
2473e7a558SHong Zhang    Level: developer
2573e7a558SHong Zhang @*/
26d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode MatCheckCompressedRow(Mat A, PetscInt nrows, Mat_CompressedRow *compressedrow, PetscInt *ai, PetscInt mbs, PetscReal ratio)
27d71ae5a4SJacob Faibussowitsch {
2811e456e1SBarry Smith   PetscInt *cpi = NULL, *ridx = NULL, nz, i, row;
2973e7a558SHong Zhang 
3073e7a558SHong Zhang   PetscFunctionBegin;
31cd6b891eSBarry Smith   /* in case this is being reused, delete old space */
329566063dSJacob Faibussowitsch   PetscCall(PetscFree2(compressedrow->i, compressedrow->rindex));
338865f1eaSKarl Rupp 
3473e7a558SHong Zhang   /* compute number of zero rows */
3511e456e1SBarry Smith   nrows = mbs - nrows;
36baa4e9faSMark F. Adams 
37317fbc4cSHong Zhang   /* if a large number of zero rows is found, use compressedrow data structure */
38317fbc4cSHong Zhang   if (nrows < ratio * mbs) {
3973e7a558SHong Zhang     compressedrow->use = PETSC_FALSE;
408865f1eaSKarl Rupp 
4163a3b9bcSJacob Faibussowitsch     PetscCall(PetscInfo(A, "Found the ratio (num_zerorows %" PetscInt_FMT ")/(num_localrows %" PetscInt_FMT ") < %g. Do not use CompressedRow routines.\n", nrows, mbs, (double)ratio));
4273e7a558SHong Zhang   } else {
4373e7a558SHong Zhang     compressedrow->use = PETSC_TRUE;
448865f1eaSKarl Rupp 
4563a3b9bcSJacob Faibussowitsch     PetscCall(PetscInfo(A, "Found the ratio (num_zerorows %" PetscInt_FMT ")/(num_localrows %" PetscInt_FMT ") > %g. Use CompressedRow routines.\n", nrows, mbs, (double)ratio));
4673e7a558SHong Zhang 
4773e7a558SHong Zhang     /* set compressed row format */
48317fbc4cSHong Zhang     nrows = mbs - nrows; /* num of non-zero rows */
499566063dSJacob Faibussowitsch     PetscCall(PetscMalloc2(nrows + 1, &cpi, nrows, &ridx));
5073e7a558SHong Zhang     row    = 0;
5173e7a558SHong Zhang     cpi[0] = 0;
52317fbc4cSHong Zhang     for (i = 0; i < mbs; i++) {
5373e7a558SHong Zhang       nz = ai[i + 1] - ai[i];
5473e7a558SHong Zhang       if (nz == 0) continue;
5573e7a558SHong Zhang       cpi[row + 1] = ai[i + 1]; /* compressed row pointer */
567b2bb3b9SHong Zhang       ridx[row++]  = i;         /* compressed row local index */
5773e7a558SHong Zhang     }
5873e7a558SHong Zhang     compressedrow->nrows  = nrows;
5973e7a558SHong Zhang     compressedrow->i      = cpi;
607b2bb3b9SHong Zhang     compressedrow->rindex = ridx;
6173e7a558SHong Zhang   }
623ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
6373e7a558SHong Zhang }
64