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