xref: /petsc/src/mat/utils/compressedrow.c (revision 88e51ccdbdf15a224310b97d3bcdb5f9f45a1f95)
173e7a558SHong Zhang 
226e093fcSHong Zhang #include "src/mat/matimpl.h"  /*I   "petscmat.h"  I*/
326e093fcSHong Zhang 
473e7a558SHong Zhang #undef __FUNCT__
573e7a558SHong Zhang #define __FUNCT__ "Mat_CheckCompressedRow"
673e7a558SHong Zhang /*@C
773e7a558SHong Zhang    Mat_CheckCompressedRow - Determines whether the compressed row matrix format should be used. If
873e7a558SHong Zhang                             the format is to be used, this routine creates Mat_CompressedRow struct.
973e7a558SHong Zhang 
1073e7a558SHong Zhang                             Compressed row format provides high performance routines by
1173e7a558SHong Zhang                             taking advantage of zero rows.
1273e7a558SHong Zhang 
1373e7a558SHong Zhang    Collective
1473e7a558SHong Zhang 
1573e7a558SHong Zhang    Input Parameters:
1673e7a558SHong Zhang +  A             - the matrix
1773e7a558SHong Zhang .  compressedrow - pointer to the struct Mat_CompressedRow
1873e7a558SHong Zhang .  ai            - row pointer used by seqaij and seqbaij
1973e7a558SHong Zhang -  ratio         - ratio of (num of zero rows)/m, used to determine if the compressed row format should be used
2073e7a558SHong Zhang 
2173e7a558SHong Zhang    Level: developer
2273e7a558SHong Zhang @*/
2373e7a558SHong Zhang PetscErrorCode Mat_CheckCompressedRow(Mat A,Mat_CompressedRow *compressedrow,PetscInt *ai,PetscReal ratio)
2473e7a558SHong Zhang {
2573e7a558SHong Zhang   PetscErrorCode ierr;
267b2bb3b9SHong Zhang   PetscInt       nrows,*cpi=PETSC_NULL,*ridx=PETSC_NULL,nz,i,row,m=A->m/A->bs;
2773e7a558SHong Zhang 
2873e7a558SHong Zhang   PetscFunctionBegin;
29*88e51ccdSHong Zhang   if (!compressedrow->use) PetscFunctionReturn(0);
30*88e51ccdSHong Zhang   if (compressedrow->checked && !A->same_nonzero){
31*88e51ccdSHong Zhang     ierr = PetscFree(compressedrow->i);CHKERRQ(ierr);
32*88e51ccdSHong Zhang     compressedrow->rindex = PETSC_NULL;
33*88e51ccdSHong Zhang     PetscLogInfo(A,"Mat_CheckCompressedRow: Mat structure might be changed. Free memory and recheck.\n");
34*88e51ccdSHong Zhang   }
3573e7a558SHong Zhang   compressedrow->checked = PETSC_TRUE;
3673e7a558SHong Zhang 
3773e7a558SHong Zhang   /* compute number of zero rows */
3873e7a558SHong Zhang   nrows = 0;
3973e7a558SHong Zhang   for (i=0; i<m; i++){                /* for each row */
4073e7a558SHong Zhang     nz = ai[i+1] - ai[i];       /* number of nonzeros */
4173e7a558SHong Zhang     if (nz == 0) nrows++;
4273e7a558SHong Zhang   }
4373e7a558SHong Zhang   /* if enough zero rows are found, use compressedrow data structure */
4473e7a558SHong Zhang   if (nrows < ratio*m) {
4573e7a558SHong Zhang     compressedrow->use = PETSC_FALSE;
4626e093fcSHong Zhang     PetscLogInfo(A,"Mat_CheckCompressedRow: Found the ratio (num_zerorows %d)/(num_localrows %d) < %g. Do not use CompressedRow routines.\n",nrows,m,ratio);
4773e7a558SHong Zhang   } else {
4873e7a558SHong Zhang     compressedrow->use = PETSC_TRUE;
4973e7a558SHong Zhang     PetscLogInfo(A,"Mat_CheckCompressedRow: Found the ratio (num_zerorows %d)/(num_localrows %d) > %g. Use CompressedRow routines.\n",nrows,m,ratio);
5073e7a558SHong Zhang 
5173e7a558SHong Zhang     /* set compressed row format */
5273e7a558SHong Zhang     nrows = m - nrows; /* num of non-zero rows */
5373e7a558SHong Zhang     ierr = PetscMalloc((2*nrows+1)*sizeof(PetscInt),&cpi);CHKERRQ(ierr);
547b2bb3b9SHong Zhang     ridx = cpi + nrows + 1;
5573e7a558SHong Zhang     row    = 0;
5673e7a558SHong Zhang     cpi[0] = 0;
5773e7a558SHong Zhang     for (i=0; i<m; i++){
5873e7a558SHong Zhang       nz = ai[i+1] - ai[i];
5973e7a558SHong Zhang       if (nz == 0) continue;
6073e7a558SHong Zhang       cpi[row+1]  = ai[i+1];    /* compressed row pointer */
617b2bb3b9SHong Zhang       ridx[row++] = i;          /* compressed row local index */
6273e7a558SHong Zhang     }
6373e7a558SHong Zhang     compressedrow->nrows  = nrows;
6473e7a558SHong Zhang     compressedrow->i      = cpi;
657b2bb3b9SHong Zhang     compressedrow->rindex = ridx;
6673e7a558SHong Zhang   }
6773e7a558SHong Zhang   PetscFunctionReturn(0);
6873e7a558SHong Zhang }
69