xref: /petsc/src/mat/tutorials/ex11.c (revision 2c71b3e237ead271e4f3aa1505f92bf476e3413d)
1c4762a1bSJed Brown 
2c4762a1bSJed Brown static char help[] = "Tests MatMeshToDual()\n\n";
3c4762a1bSJed Brown 
4c4762a1bSJed Brown /*T
5c4762a1bSJed Brown    Concepts: Mat^mesh partitioning
6c4762a1bSJed Brown    Processors: n
7c4762a1bSJed Brown T*/
8c4762a1bSJed Brown 
9c4762a1bSJed Brown /*
10c4762a1bSJed Brown   Include "petscmat.h" so that we can use matrices.
11c4762a1bSJed Brown   automatically includes:
12c4762a1bSJed Brown      petscsys.h       - base PETSc routines   petscvec.h    - vectors
13c4762a1bSJed Brown      petscmat.h    - matrices
14c4762a1bSJed Brown      petscis.h     - index sets            petscviewer.h - viewers
15c4762a1bSJed Brown */
16c4762a1bSJed Brown #include <petscmat.h>
17c4762a1bSJed Brown 
18c4762a1bSJed Brown int main(int argc,char **args)
19c4762a1bSJed Brown {
20c4762a1bSJed Brown   Mat             mesh,dual;
21c4762a1bSJed Brown   PetscErrorCode  ierr;
22c4762a1bSJed Brown   PetscInt        Nvertices = 6;       /* total number of vertices */
23c4762a1bSJed Brown   PetscInt        ncells    = 2;       /* number cells on this process */
24c4762a1bSJed Brown   PetscInt        *ii,*jj;
25c4762a1bSJed Brown   PetscMPIInt     size,rank;
26c4762a1bSJed Brown   MatPartitioning part;
27c4762a1bSJed Brown   IS              is;
28c4762a1bSJed Brown 
29c4762a1bSJed Brown   ierr = PetscInitialize(&argc,&args,(char*)0,help);if (ierr) return ierr;
30ffc4695bSBarry Smith   ierr = MPI_Comm_size(MPI_COMM_WORLD,&size);CHKERRMPI(ierr);
31*2c71b3e2SJacob Faibussowitsch   PetscCheckFalse(size != 2,PETSC_COMM_WORLD,PETSC_ERR_SUP,"This example is for exactly two processes");
32ffc4695bSBarry Smith   ierr = MPI_Comm_rank(MPI_COMM_WORLD,&rank);CHKERRMPI(ierr);
33c4762a1bSJed Brown 
34c4762a1bSJed Brown   ierr  = PetscMalloc1(3,&ii);CHKERRQ(ierr);
35c4762a1bSJed Brown   ierr  = PetscMalloc1(6,&jj);CHKERRQ(ierr);
36c4762a1bSJed Brown   ii[0] = 0; ii[1] = 3; ii[2] = 6;
37dd400576SPatrick Sanan   if (rank == 0) {
38c4762a1bSJed Brown     jj[0] = 0; jj[1] = 1; jj[2] = 2; jj[3] = 1; jj[4] = 2; jj[5] = 3;
39c4762a1bSJed Brown   } else {
40c4762a1bSJed Brown     jj[0] = 1; jj[1] = 4; jj[2] = 5; jj[3] = 1; jj[4] = 3; jj[5] = 5;
41c4762a1bSJed Brown   }
42c4762a1bSJed Brown   ierr = MatCreateMPIAdj(MPI_COMM_WORLD,ncells,Nvertices,ii,jj,NULL,&mesh);CHKERRQ(ierr);
43c4762a1bSJed Brown   ierr = MatMeshToCellGraph(mesh,2,&dual);CHKERRQ(ierr);
44c4762a1bSJed Brown   ierr = MatView(dual,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
45c4762a1bSJed Brown 
46c4762a1bSJed Brown   ierr = MatPartitioningCreate(MPI_COMM_WORLD,&part);CHKERRQ(ierr);
47c4762a1bSJed Brown   ierr = MatPartitioningSetAdjacency(part,dual);CHKERRQ(ierr);
48c4762a1bSJed Brown   ierr = MatPartitioningSetFromOptions(part);CHKERRQ(ierr);
49c4762a1bSJed Brown   ierr = MatPartitioningApply(part,&is);CHKERRQ(ierr);
50c4762a1bSJed Brown   ierr = ISView(is,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
51c4762a1bSJed Brown   ierr = ISDestroy(&is);CHKERRQ(ierr);
52c4762a1bSJed Brown   ierr = MatPartitioningDestroy(&part);CHKERRQ(ierr);
53c4762a1bSJed Brown 
54c4762a1bSJed Brown   ierr = MatDestroy(&mesh);CHKERRQ(ierr);
55c4762a1bSJed Brown   ierr = MatDestroy(&dual);CHKERRQ(ierr);
56c4762a1bSJed Brown   ierr = PetscFinalize();
57c4762a1bSJed Brown   return ierr;
58c4762a1bSJed Brown }
59c4762a1bSJed Brown 
60c4762a1bSJed Brown /*TEST
61c4762a1bSJed Brown 
62c4762a1bSJed Brown    build:
63c4762a1bSJed Brown      requires: parmetis
64c4762a1bSJed Brown 
65c4762a1bSJed Brown    test:
66c4762a1bSJed Brown       nsize: 2
67c4762a1bSJed Brown       requires: parmetis
68c4762a1bSJed Brown 
69c4762a1bSJed Brown TEST*/
70