Actual source code: compressedrow.c

      1: #include <petsc/private/matimpl.h>

      3: /*@C
      4:    MatCheckCompressedRow - Determines whether the compressed row matrix format should be used.
      5:       If the format is to be used, this routine creates Mat_CompressedRow struct.
      6:       Compressed row format provides high performance routines by taking advantage of zero rows.
      7:       Supported types are MATAIJ, MATBAIJ and MATSBAIJ.

      9:    Collective

     11:    Input Parameters:
     12: +  A             - the matrix
     13: .  nrows         - number of rows with nonzero entries
     14: .  compressedrow - pointer to the struct Mat_CompressedRow
     15: .  ai            - row pointer used by seqaij and seqbaij
     16: .  mbs           - number of (block) rows represented by ai
     17: -  ratio         - ratio of (num of zero rows)/m, used to determine if the compressed row format should be used

     19:    Developer Note: The reason this takes the compressedrow, ai and mbs arguments is because it is called by both the SeqAIJ and SEQBAIJ matrices and
     20:                    the values are not therefore obtained by directly taking the values from the matrix object.
     21:                    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
     22:                    by some preconditioners and hence is labeled as PETSC_EXTERN

     24:    Level: developer
     25: @*/
     26: PETSC_EXTERN PetscErrorCode MatCheckCompressedRow(Mat A,PetscInt nrows,Mat_CompressedRow *compressedrow,PetscInt *ai,PetscInt mbs,PetscReal ratio)
     27: {
     28:   PetscInt       *cpi=NULL,*ridx=NULL,nz,i,row;

     30:   /* in case this is being reused, delete old space */
     31:   PetscFree2(compressedrow->i,compressedrow->rindex);

     33:   /* compute number of zero rows */
     34:   nrows = mbs - nrows;

     36:   /* if a large number of zero rows is found, use compressedrow data structure */
     37:   if (nrows < ratio*mbs) {
     38:     compressedrow->use = PETSC_FALSE;

     40:     PetscInfo(A,"Found the ratio (num_zerorows %d)/(num_localrows %d) < %g. Do not use CompressedRow routines.\n",nrows,mbs,(double)ratio);
     41:   } else {
     42:     compressedrow->use = PETSC_TRUE;

     44:     PetscInfo(A,"Found the ratio (num_zerorows %d)/(num_localrows %d) > %g. Use CompressedRow routines.\n",nrows,mbs,(double)ratio);

     46:     /* set compressed row format */
     47:     nrows  = mbs - nrows; /* num of non-zero rows */
     48:     PetscMalloc2(nrows+1,&cpi,nrows,&ridx);
     49:     row    = 0;
     50:     cpi[0] = 0;
     51:     for (i=0; i<mbs; i++) {
     52:       nz = ai[i+1] - ai[i];
     53:       if (nz == 0) continue;
     54:       cpi[row+1]  = ai[i+1];    /* compressed row pointer */
     55:       ridx[row++] = i;          /* compressed row local index */
     56:     }
     57:     compressedrow->nrows  = nrows;
     58:     compressedrow->i      = cpi;
     59:     compressedrow->rindex = ridx;
     60:   }
     61:   return 0;
     62: }