xref: /petsc/src/mat/tests/ex80.c (revision df4cd43f92eaa320656440c40edb1046daee8f75)
1 
2 static char help[] = "Partition tiny grid.\n\n";
3 
4 /*
5   Include "petscmat.h" so that we can use matrices.  Note that this file
6   automatically includes:
7      petscsys.h       - base PETSc routines   petscvec.h - vectors
8      petscmat.h - matrices
9      petscis.h     - index sets
10      petscviewer.h - viewers
11 */
12 #include <petscmat.h>
13 
14 int main(int argc, char **args)
15 {
16   Mat             A, At;
17   PetscMPIInt     rank, size;
18   PetscInt       *ia, *ja, row;
19   MatPartitioning part;
20   IS              is, isn;
21   PetscBool       equal;
22 
23   PetscFunctionBeginUser;
24   PetscCall(PetscInitialize(&argc, &args, (char *)0, help));
25   PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
26   PetscCheck(size == 4, PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Must run with 4 processors");
27   PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
28 
29   PetscCall(PetscMalloc1(5, &ia));
30   PetscCall(PetscMalloc1(16, &ja));
31   if (rank == 0) {
32     ja[0] = 1;
33     ja[1] = 4;
34     ja[2] = 0;
35     ja[3] = 2;
36     ja[4] = 5;
37     ja[5] = 1;
38     ja[6] = 3;
39     ja[7] = 6;
40     ja[8] = 2;
41     ja[9] = 7;
42     ia[0] = 0;
43     ia[1] = 2;
44     ia[2] = 5;
45     ia[3] = 8;
46     ia[4] = 10;
47   } else if (rank == 1) {
48     ja[0]  = 0;
49     ja[1]  = 5;
50     ja[2]  = 8;
51     ja[3]  = 1;
52     ja[4]  = 4;
53     ja[5]  = 6;
54     ja[6]  = 9;
55     ja[7]  = 2;
56     ja[8]  = 5;
57     ja[9]  = 7;
58     ja[10] = 10;
59     ja[11] = 3;
60     ja[12] = 6;
61     ja[13] = 11;
62     ia[0]  = 0;
63     ia[1]  = 3;
64     ia[2]  = 7;
65     ia[3]  = 11;
66     ia[4]  = 14;
67   } else if (rank == 2) {
68     ja[0]  = 4;
69     ja[1]  = 9;
70     ja[2]  = 12;
71     ja[3]  = 5;
72     ja[4]  = 8;
73     ja[5]  = 10;
74     ja[6]  = 13;
75     ja[7]  = 6;
76     ja[8]  = 9;
77     ja[9]  = 11;
78     ja[10] = 14;
79     ja[11] = 7;
80     ja[12] = 10;
81     ja[13] = 15;
82     ia[0]  = 0;
83     ia[1]  = 3;
84     ia[2]  = 7;
85     ia[3]  = 11;
86     ia[4]  = 14;
87   } else {
88     ja[0] = 8;
89     ja[1] = 13;
90     ja[2] = 9;
91     ja[3] = 12;
92     ja[4] = 14;
93     ja[5] = 10;
94     ja[6] = 13;
95     ja[7] = 15;
96     ja[8] = 11;
97     ja[9] = 14;
98     ia[0] = 0;
99     ia[1] = 2;
100     ia[2] = 5;
101     ia[3] = 8;
102     ia[4] = 10;
103   }
104 
105   PetscCall(MatCreateMPIAdj(PETSC_COMM_WORLD, 4, 16, ia, ja, NULL, &A));
106   PetscCall(MatView(A, PETSC_VIEWER_STDOUT_WORLD));
107 
108   /* Create the same matrix but using MatSetValues() */
109   PetscCall(MatCreate(PETSC_COMM_WORLD, &At));
110   PetscCall(MatSetSizes(At, 4, 4, 16, 16));
111   PetscCall(MatSetType(At, MATMPIADJ));
112   for (PetscInt i = 0; i < 4; i++) {
113     row = i + 4 * rank;
114     PetscCall(MatSetValues(At, 1, &row, ia[i + 1] - ia[i], ja + ia[i], NULL, INSERT_VALUES));
115   }
116   PetscCall(MatAssemblyBegin(At, MAT_FINAL_ASSEMBLY));
117   PetscCall(MatAssemblyEnd(At, MAT_FINAL_ASSEMBLY));
118   PetscCall(MatEqual(A, At, &equal));
119   PetscCheck(equal, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "Matrices are not equal that should be equal");
120   PetscCall(MatDestroy(&At));
121 
122   /*
123        Partition the graph of the matrix
124   */
125   PetscCall(MatPartitioningCreate(PETSC_COMM_WORLD, &part));
126   PetscCall(MatPartitioningSetAdjacency(part, A));
127   PetscCall(MatPartitioningSetFromOptions(part));
128   /* get new processor owner number of each vertex */
129   PetscCall(MatPartitioningApply(part, &is));
130   /* get new global number of each old global number */
131   PetscCall(ISPartitioningToNumbering(is, &isn));
132   PetscCall(ISView(isn, PETSC_VIEWER_STDOUT_WORLD));
133   PetscCall(ISDestroy(&is));
134 
135   PetscCall(ISDestroy(&isn));
136   PetscCall(MatPartitioningDestroy(&part));
137 
138   /*
139        Free work space.  All PETSc objects should be destroyed when they
140        are no longer needed.
141   */
142   PetscCall(MatDestroy(&A));
143 
144   PetscCall(PetscFinalize());
145   return 0;
146 }
147 /*
148    test:
149      requires: parmetis
150      args: -mat_view
151      nsize: 4
152 */
153