xref: /petsc/src/mat/tutorials/ex11.c (revision c9df829d41ec13fc316a62eed77ff350dff6e12a)
1*c080761bSJose E. Roman static char help[] = "Tests MatMeshToCellGraph()\n\n";
2c4762a1bSJed Brown 
3c4762a1bSJed Brown /*
4c4762a1bSJed Brown   Include "petscmat.h" so that we can use matrices.
5c4762a1bSJed Brown   automatically includes:
6c4762a1bSJed Brown      petscsys.h       - base PETSc routines   petscvec.h    - vectors
7c4762a1bSJed Brown      petscmat.h    - matrices
8c4762a1bSJed Brown      petscis.h     - index sets            petscviewer.h - viewers
9c4762a1bSJed Brown */
10c4762a1bSJed Brown #include <petscmat.h>
11c4762a1bSJed Brown 
main(int argc,char ** args)12d71ae5a4SJacob Faibussowitsch int main(int argc, char **args)
13d71ae5a4SJacob Faibussowitsch {
14c4762a1bSJed Brown   Mat             mesh, dual;
15c4762a1bSJed Brown   PetscInt        Nvertices = 6; /* total number of vertices */
16c4762a1bSJed Brown   PetscInt        ncells    = 2; /* number cells on this process */
17c4762a1bSJed Brown   PetscInt       *ii, *jj;
18c4762a1bSJed Brown   PetscMPIInt     size, rank;
19c4762a1bSJed Brown   MatPartitioning part;
20c4762a1bSJed Brown   IS              is;
21c4762a1bSJed Brown 
22327415f7SBarry Smith   PetscFunctionBeginUser;
23c8025a54SPierre Jolivet   PetscCall(PetscInitialize(&argc, &args, NULL, help));
249566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(MPI_COMM_WORLD, &size));
25be096a46SBarry Smith   PetscCheck(size == 2, PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "This example is for exactly two processes");
269566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(MPI_COMM_WORLD, &rank));
27c4762a1bSJed Brown 
289566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(3, &ii));
299566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(6, &jj));
309371c9d4SSatish Balay   ii[0] = 0;
319371c9d4SSatish Balay   ii[1] = 3;
329371c9d4SSatish Balay   ii[2] = 6;
33dd400576SPatrick Sanan   if (rank == 0) {
349371c9d4SSatish Balay     jj[0] = 0;
359371c9d4SSatish Balay     jj[1] = 1;
369371c9d4SSatish Balay     jj[2] = 2;
379371c9d4SSatish Balay     jj[3] = 1;
389371c9d4SSatish Balay     jj[4] = 2;
399371c9d4SSatish Balay     jj[5] = 3;
40c4762a1bSJed Brown   } else {
419371c9d4SSatish Balay     jj[0] = 1;
429371c9d4SSatish Balay     jj[1] = 4;
439371c9d4SSatish Balay     jj[2] = 5;
449371c9d4SSatish Balay     jj[3] = 1;
459371c9d4SSatish Balay     jj[4] = 3;
469371c9d4SSatish Balay     jj[5] = 5;
47c4762a1bSJed Brown   }
489566063dSJacob Faibussowitsch   PetscCall(MatCreateMPIAdj(MPI_COMM_WORLD, ncells, Nvertices, ii, jj, NULL, &mesh));
499566063dSJacob Faibussowitsch   PetscCall(MatMeshToCellGraph(mesh, 2, &dual));
509566063dSJacob Faibussowitsch   PetscCall(MatView(dual, PETSC_VIEWER_STDOUT_WORLD));
51c4762a1bSJed Brown 
529566063dSJacob Faibussowitsch   PetscCall(MatPartitioningCreate(MPI_COMM_WORLD, &part));
539566063dSJacob Faibussowitsch   PetscCall(MatPartitioningSetAdjacency(part, dual));
549566063dSJacob Faibussowitsch   PetscCall(MatPartitioningSetFromOptions(part));
559566063dSJacob Faibussowitsch   PetscCall(MatPartitioningApply(part, &is));
569566063dSJacob Faibussowitsch   PetscCall(ISView(is, PETSC_VIEWER_STDOUT_WORLD));
579566063dSJacob Faibussowitsch   PetscCall(ISDestroy(&is));
589566063dSJacob Faibussowitsch   PetscCall(MatPartitioningDestroy(&part));
59c4762a1bSJed Brown 
609566063dSJacob Faibussowitsch   PetscCall(MatDestroy(&mesh));
619566063dSJacob Faibussowitsch   PetscCall(MatDestroy(&dual));
629566063dSJacob Faibussowitsch   PetscCall(PetscFinalize());
63b122ec5aSJacob Faibussowitsch   return 0;
64c4762a1bSJed Brown }
65c4762a1bSJed Brown 
66c4762a1bSJed Brown /*TEST
67c4762a1bSJed Brown 
68c4762a1bSJed Brown    build:
69c4762a1bSJed Brown      requires: parmetis
70c4762a1bSJed Brown 
71c4762a1bSJed Brown    test:
72c4762a1bSJed Brown       nsize: 2
73c4762a1bSJed Brown 
74c4762a1bSJed Brown TEST*/
75