Actual source code: natural.c

petsc-3.5.4 2015-05-23
Report Typos and Errors
  1: #include <petsc-private/matimpl.h>      /*I "petscmat.h"  I*/

  5: PETSC_EXTERN PetscErrorCode MatColoringApply_Natural(MatColoring mc,ISColoring *iscoloring)
  6: {
  7:   PetscErrorCode  ierr;
  8:   PetscInt        start,end,i,bs = 1,n;
  9:   ISColoringValue *colors;
 10:   MPI_Comm        comm;
 11:   PetscBool       flg1,flg2;
 12:   Mat             mat     = mc->mat;
 13:   Mat             mat_seq = mc->mat;
 14:   PetscMPIInt     size;
 15:   ISColoring      iscoloring_seq;
 16:   ISColoringValue *colors_loc;
 17:   PetscInt        rstart,rend,N_loc,nc;

 20:   /* this is ugly way to get blocksize but cannot call MatGetBlockSize() because AIJ can have bs > 1 */
 21:   PetscObjectTypeCompare((PetscObject)mat,MATSEQBAIJ,&flg1);
 22:   PetscObjectTypeCompare((PetscObject)mat,MATMPIBAIJ,&flg2);
 23:   if (flg1 || flg2) {
 24:     MatGetBlockSize(mat,&bs);
 25:   }

 27:   PetscObjectGetComm((PetscObject)mat,&comm);
 28:   MPI_Comm_size(comm,&size);
 29:   if (size > 1) {
 30:     /* create a sequential iscoloring on all processors */
 31:     MatGetSeqNonzeroStructure(mat,&mat_seq);
 32:   }

 34:   MatGetSize(mat_seq,&n,NULL);
 35:   MatGetOwnershipRange(mat_seq,&start,&end);
 36:   n    = n/bs;
 37:   if (n > IS_COLORING_MAX-1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Maximum color size exceeded");

 39:   start = start/bs;
 40:   end   = end/bs;
 41:   PetscMalloc1((end-start+1),&colors);
 42:   for (i=start; i<end; i++) {
 43:     colors[i-start] = (ISColoringValue)i;
 44:   }
 45:   ISColoringCreate(comm,n,end-start,colors,iscoloring);

 47:   if (size > 1) {
 48:     MatDestroySeqNonzeroStructure(&mat_seq);

 50:     /* convert iscoloring_seq to a parallel iscoloring */
 51:     iscoloring_seq = *iscoloring;
 52:     rstart         = mat->rmap->rstart/bs;
 53:     rend           = mat->rmap->rend/bs;
 54:     N_loc          = rend - rstart; /* number of local nodes */

 56:     /* get local colors for each local node */
 57:     PetscMalloc1((N_loc+1),&colors_loc);
 58:     for (i=rstart; i<rend; i++) {
 59:       colors_loc[i-rstart] = iscoloring_seq->colors[i];
 60:     }
 61:     /* create a parallel iscoloring */
 62:     nc   = iscoloring_seq->n;
 63:     ISColoringCreate(comm,nc,N_loc,colors_loc,iscoloring);
 64:     ISColoringDestroy(&iscoloring_seq);
 65:   }
 66:   return(0);
 67: }

 71: PETSC_EXTERN PetscErrorCode MatColoringCreate_Natural(MatColoring mc)
 72: {
 74:     mc->data                = NULL;
 75:     mc->ops->apply          = MatColoringApply_Natural;
 76:     mc->ops->view           = NULL;
 77:     mc->ops->destroy        = NULL;
 78:     mc->ops->setfromoptions = NULL;
 79:     return(0);
 80: }