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