Actual source code: natural.c
petsc-3.5.4 2015-05-23
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: }