xref: /petsc/src/dm/partitioner/interface/partitioner.c (revision 9371c9d470a9602b6d10a8bf50c9b2280a79e45a)
1abe9303eSLisandro Dalcin #include <petsc/private/partitionerimpl.h> /*I "petscpartitioner.h" I*/
2abe9303eSLisandro Dalcin 
3abe9303eSLisandro Dalcin /*@C
4abe9303eSLisandro Dalcin   PetscPartitionerSetType - Builds a particular PetscPartitioner
5abe9303eSLisandro Dalcin 
6abe9303eSLisandro Dalcin   Collective on PetscPartitioner
7abe9303eSLisandro Dalcin 
8abe9303eSLisandro Dalcin   Input Parameters:
9abe9303eSLisandro Dalcin + part - The PetscPartitioner object
10abe9303eSLisandro Dalcin - name - The kind of partitioner
11abe9303eSLisandro Dalcin 
12abe9303eSLisandro Dalcin   Options Database Key:
13abe9303eSLisandro Dalcin . -petscpartitioner_type <type> - Sets the PetscPartitioner type; use -help for a list of available types
14abe9303eSLisandro Dalcin 
156e0dc72eSMatthew G. Knepley   Note:
166e0dc72eSMatthew G. Knepley $ PETSCPARTITIONERCHACO    - The Chaco partitioner (--download-chaco)
176e0dc72eSMatthew G. Knepley $ PETSCPARTITIONERPARMETIS - The ParMetis partitioner (--download-parmetis)
186e0dc72eSMatthew G. Knepley $ PETSCPARTITIONERSHELL    - A shell partitioner implemented by the user
196e0dc72eSMatthew G. Knepley $ PETSCPARTITIONERSIMPLE   - A simple partitioner that divides cells into equal, contiguous chunks
206e0dc72eSMatthew G. Knepley $ PETSCPARTITIONERGATHER   - Gathers all cells onto process 0
216e0dc72eSMatthew G. Knepley 
22abe9303eSLisandro Dalcin   Level: intermediate
23abe9303eSLisandro Dalcin 
24db781477SPatrick Sanan .seealso: `PetscPartitionerGetType()`, `PetscPartitionerCreate()`
25abe9303eSLisandro Dalcin @*/
26*9371c9d4SSatish Balay PetscErrorCode PetscPartitionerSetType(PetscPartitioner part, PetscPartitionerType name) {
27abe9303eSLisandro Dalcin   PetscErrorCode (*r)(PetscPartitioner);
28abe9303eSLisandro Dalcin   PetscBool match;
29abe9303eSLisandro Dalcin 
30abe9303eSLisandro Dalcin   PetscFunctionBegin;
31abe9303eSLisandro Dalcin   PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1);
329566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)part, name, &match));
33abe9303eSLisandro Dalcin   if (match) PetscFunctionReturn(0);
34abe9303eSLisandro Dalcin 
359566063dSJacob Faibussowitsch   PetscCall(PetscPartitionerRegisterAll());
369566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListFind(PetscPartitionerList, name, &r));
3728b400f6SJacob Faibussowitsch   PetscCheck(r, PetscObjectComm((PetscObject)part), PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown PetscPartitioner type: %s", name);
38abe9303eSLisandro Dalcin 
39dbbe0bcdSBarry Smith   PetscTryTypeMethod(part, destroy);
40abe9303eSLisandro Dalcin   part->noGraph = PETSC_FALSE;
419566063dSJacob Faibussowitsch   PetscCall(PetscMemzero(part->ops, sizeof(*part->ops)));
429566063dSJacob Faibussowitsch   PetscCall(PetscObjectChangeTypeName((PetscObject)part, name));
439566063dSJacob Faibussowitsch   PetscCall((*r)(part));
44abe9303eSLisandro Dalcin   PetscFunctionReturn(0);
45abe9303eSLisandro Dalcin }
46abe9303eSLisandro Dalcin 
47abe9303eSLisandro Dalcin /*@C
48abe9303eSLisandro Dalcin   PetscPartitionerGetType - Gets the PetscPartitioner type name (as a string) from the object.
49abe9303eSLisandro Dalcin 
50abe9303eSLisandro Dalcin   Not Collective
51abe9303eSLisandro Dalcin 
52abe9303eSLisandro Dalcin   Input Parameter:
53abe9303eSLisandro Dalcin . part - The PetscPartitioner
54abe9303eSLisandro Dalcin 
55abe9303eSLisandro Dalcin   Output Parameter:
56abe9303eSLisandro Dalcin . name - The PetscPartitioner type name
57abe9303eSLisandro Dalcin 
58abe9303eSLisandro Dalcin   Level: intermediate
59abe9303eSLisandro Dalcin 
60db781477SPatrick Sanan .seealso: `PetscPartitionerSetType()`, `PetscPartitionerCreate()`
61abe9303eSLisandro Dalcin @*/
62*9371c9d4SSatish Balay PetscErrorCode PetscPartitionerGetType(PetscPartitioner part, PetscPartitionerType *name) {
63abe9303eSLisandro Dalcin   PetscFunctionBegin;
64abe9303eSLisandro Dalcin   PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1);
65abe9303eSLisandro Dalcin   PetscValidPointer(name, 2);
66abe9303eSLisandro Dalcin   *name = ((PetscObject)part)->type_name;
67abe9303eSLisandro Dalcin   PetscFunctionReturn(0);
68abe9303eSLisandro Dalcin }
69abe9303eSLisandro Dalcin 
70abe9303eSLisandro Dalcin /*@C
71abe9303eSLisandro Dalcin    PetscPartitionerViewFromOptions - View from Options
72abe9303eSLisandro Dalcin 
73abe9303eSLisandro Dalcin    Collective on PetscPartitioner
74abe9303eSLisandro Dalcin 
75abe9303eSLisandro Dalcin    Input Parameters:
76abe9303eSLisandro Dalcin +  A - the PetscPartitioner object
77abe9303eSLisandro Dalcin .  obj - Optional object
78abe9303eSLisandro Dalcin -  name - command line option
79abe9303eSLisandro Dalcin 
80abe9303eSLisandro Dalcin    Level: intermediate
81db781477SPatrick Sanan .seealso: `PetscPartitionerView()`, `PetscObjectViewFromOptions()`
82abe9303eSLisandro Dalcin @*/
83*9371c9d4SSatish Balay PetscErrorCode PetscPartitionerViewFromOptions(PetscPartitioner A, PetscObject obj, const char name[]) {
84abe9303eSLisandro Dalcin   PetscFunctionBegin;
85abe9303eSLisandro Dalcin   PetscValidHeaderSpecific(A, PETSCPARTITIONER_CLASSID, 1);
869566063dSJacob Faibussowitsch   PetscCall(PetscObjectViewFromOptions((PetscObject)A, obj, name));
87abe9303eSLisandro Dalcin   PetscFunctionReturn(0);
88abe9303eSLisandro Dalcin }
89abe9303eSLisandro Dalcin 
90abe9303eSLisandro Dalcin /*@
91abe9303eSLisandro Dalcin   PetscPartitionerView - Views a PetscPartitioner
92abe9303eSLisandro Dalcin 
93abe9303eSLisandro Dalcin   Collective on PetscPartitioner
94abe9303eSLisandro Dalcin 
95d8d19677SJose E. Roman   Input Parameters:
96abe9303eSLisandro Dalcin + part - the PetscPartitioner object to view
97abe9303eSLisandro Dalcin - v    - the viewer
98abe9303eSLisandro Dalcin 
99abe9303eSLisandro Dalcin   Level: developer
100abe9303eSLisandro Dalcin 
101db781477SPatrick Sanan .seealso: `PetscPartitionerDestroy()`
102abe9303eSLisandro Dalcin @*/
103*9371c9d4SSatish Balay PetscErrorCode PetscPartitionerView(PetscPartitioner part, PetscViewer v) {
104abe9303eSLisandro Dalcin   PetscMPIInt size;
105abe9303eSLisandro Dalcin   PetscBool   isascii;
106abe9303eSLisandro Dalcin 
107abe9303eSLisandro Dalcin   PetscFunctionBegin;
108abe9303eSLisandro Dalcin   PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1);
1099566063dSJacob Faibussowitsch   if (!v) PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)part), &v));
1109566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERASCII, &isascii));
111abe9303eSLisandro Dalcin   if (isascii) {
1129566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)part), &size));
1139566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(v, "Graph Partitioner: %d MPI Process%s\n", size, size > 1 ? "es" : ""));
1149566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(v, "  type: %s\n", ((PetscObject)part)->type_name));
11563a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(v, "  edge cut: %" PetscInt_FMT "\n", part->edgeCut));
11663a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(v, "  balance: %.2g\n", (double)part->balance));
1179566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(v, "  use vertex weights: %d\n", part->usevwgt));
118abe9303eSLisandro Dalcin   }
119dbbe0bcdSBarry Smith   PetscTryTypeMethod(part, view, v);
120abe9303eSLisandro Dalcin   PetscFunctionReturn(0);
121abe9303eSLisandro Dalcin }
122abe9303eSLisandro Dalcin 
123*9371c9d4SSatish Balay static PetscErrorCode PetscPartitionerGetDefaultType(MPI_Comm comm, const char **defaultType) {
124abe9303eSLisandro Dalcin   PetscMPIInt size;
125abe9303eSLisandro Dalcin 
126abe9303eSLisandro Dalcin   PetscFunctionBegin;
1279566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(comm, &size));
128abe9303eSLisandro Dalcin   if (size == 1) {
129abe9303eSLisandro Dalcin     *defaultType = PETSCPARTITIONERSIMPLE;
130abe9303eSLisandro Dalcin   } else {
131abe9303eSLisandro Dalcin #if defined(PETSC_HAVE_PARMETIS)
132abe9303eSLisandro Dalcin     *defaultType = PETSCPARTITIONERPARMETIS;
133abe9303eSLisandro Dalcin #elif defined(PETSC_HAVE_PTSCOTCH)
134abe9303eSLisandro Dalcin     *defaultType = PETSCPARTITIONERPTSCOTCH;
135abe9303eSLisandro Dalcin #elif defined(PETSC_HAVE_CHACO)
136abe9303eSLisandro Dalcin     *defaultType = PETSCPARTITIONERCHACO;
137abe9303eSLisandro Dalcin #else
138abe9303eSLisandro Dalcin     *defaultType = PETSCPARTITIONERSIMPLE;
139abe9303eSLisandro Dalcin #endif
140abe9303eSLisandro Dalcin   }
141abe9303eSLisandro Dalcin   PetscFunctionReturn(0);
142abe9303eSLisandro Dalcin }
143abe9303eSLisandro Dalcin 
144abe9303eSLisandro Dalcin /*@
145abe9303eSLisandro Dalcin   PetscPartitionerSetFromOptions - sets parameters in a PetscPartitioner from the options database
146abe9303eSLisandro Dalcin 
147abe9303eSLisandro Dalcin   Collective on PetscPartitioner
148abe9303eSLisandro Dalcin 
149abe9303eSLisandro Dalcin   Input Parameter:
150abe9303eSLisandro Dalcin . part - the PetscPartitioner object to set options for
151abe9303eSLisandro Dalcin 
152abe9303eSLisandro Dalcin   Options Database Keys:
153abe9303eSLisandro Dalcin +  -petscpartitioner_type <type> - Sets the PetscPartitioner type; use -help for a list of available types
154abe9303eSLisandro Dalcin .  -petscpartitioner_use_vertex_weights - Uses weights associated with the graph vertices
155abe9303eSLisandro Dalcin -  -petscpartitioner_view_graph - View the graph each time PetscPartitionerPartition is called. Viewer can be customized, see PetscOptionsGetViewer()
156abe9303eSLisandro Dalcin 
157abe9303eSLisandro Dalcin   Level: developer
158abe9303eSLisandro Dalcin 
159db781477SPatrick Sanan .seealso: `PetscPartitionerView()`, `PetscPartitionerSetType()`, `PetscPartitionerPartition()`
160abe9303eSLisandro Dalcin @*/
161*9371c9d4SSatish Balay PetscErrorCode PetscPartitionerSetFromOptions(PetscPartitioner part) {
162d7cc930eSLisandro Dalcin   const char *currentType = NULL;
163abe9303eSLisandro Dalcin   char        name[256];
164abe9303eSLisandro Dalcin   PetscBool   flg;
165abe9303eSLisandro Dalcin 
166abe9303eSLisandro Dalcin   PetscFunctionBegin;
167abe9303eSLisandro Dalcin   PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1);
168d0609cedSBarry Smith   PetscObjectOptionsBegin((PetscObject)part);
1699566063dSJacob Faibussowitsch   PetscCall(PetscPartitionerGetType(part, &currentType));
1709566063dSJacob Faibussowitsch   PetscCall(PetscOptionsFList("-petscpartitioner_type", "Graph partitioner", "PetscPartitionerSetType", PetscPartitionerList, currentType, name, sizeof(name), &flg));
1711baa6e33SBarry Smith   if (flg) PetscCall(PetscPartitionerSetType(part, name));
1729566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-petscpartitioner_use_vertex_weights", "Use vertex weights", "", part->usevwgt, &part->usevwgt, NULL));
173dbbe0bcdSBarry Smith   PetscTryTypeMethod(part, setfromoptions, PetscOptionsObject);
1749566063dSJacob Faibussowitsch   PetscCall(PetscViewerDestroy(&part->viewer));
1759566063dSJacob Faibussowitsch   PetscCall(PetscViewerDestroy(&part->viewerGraph));
1769566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetViewer(((PetscObject)part)->comm, ((PetscObject)part)->options, ((PetscObject)part)->prefix, "-petscpartitioner_view", &part->viewer, NULL, NULL));
1779566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetViewer(((PetscObject)part)->comm, ((PetscObject)part)->options, ((PetscObject)part)->prefix, "-petscpartitioner_view_graph", &part->viewerGraph, NULL, &part->viewGraph));
178abe9303eSLisandro Dalcin   /* process any options handlers added with PetscObjectAddOptionsHandler() */
179dbbe0bcdSBarry Smith   PetscCall(PetscObjectProcessOptionsHandlers((PetscObject)part, PetscOptionsObject));
180d0609cedSBarry Smith   PetscOptionsEnd();
181abe9303eSLisandro Dalcin   PetscFunctionReturn(0);
182abe9303eSLisandro Dalcin }
183abe9303eSLisandro Dalcin 
184abe9303eSLisandro Dalcin /*@
185abe9303eSLisandro Dalcin   PetscPartitionerSetUp - Construct data structures for the PetscPartitioner
186abe9303eSLisandro Dalcin 
187abe9303eSLisandro Dalcin   Collective on PetscPartitioner
188abe9303eSLisandro Dalcin 
189abe9303eSLisandro Dalcin   Input Parameter:
190abe9303eSLisandro Dalcin . part - the PetscPartitioner object to setup
191abe9303eSLisandro Dalcin 
192abe9303eSLisandro Dalcin   Level: developer
193abe9303eSLisandro Dalcin 
194db781477SPatrick Sanan .seealso: `PetscPartitionerView()`, `PetscPartitionerDestroy()`
195abe9303eSLisandro Dalcin @*/
196*9371c9d4SSatish Balay PetscErrorCode PetscPartitionerSetUp(PetscPartitioner part) {
197abe9303eSLisandro Dalcin   PetscFunctionBegin;
198abe9303eSLisandro Dalcin   PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1);
199dbbe0bcdSBarry Smith   PetscTryTypeMethod(part, setup);
200abe9303eSLisandro Dalcin   PetscFunctionReturn(0);
201abe9303eSLisandro Dalcin }
202abe9303eSLisandro Dalcin 
203abe9303eSLisandro Dalcin /*@
204abe9303eSLisandro Dalcin   PetscPartitionerReset - Resets data structures for the PetscPartitioner
205abe9303eSLisandro Dalcin 
206abe9303eSLisandro Dalcin   Collective on PetscPartitioner
207abe9303eSLisandro Dalcin 
208abe9303eSLisandro Dalcin   Input Parameter:
209abe9303eSLisandro Dalcin . part - the PetscPartitioner object to reset
210abe9303eSLisandro Dalcin 
211abe9303eSLisandro Dalcin   Level: developer
212abe9303eSLisandro Dalcin 
213db781477SPatrick Sanan .seealso: `PetscPartitionerSetUp()`, `PetscPartitionerDestroy()`
214abe9303eSLisandro Dalcin @*/
215*9371c9d4SSatish Balay PetscErrorCode PetscPartitionerReset(PetscPartitioner part) {
216abe9303eSLisandro Dalcin   PetscFunctionBegin;
217abe9303eSLisandro Dalcin   PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1);
218dbbe0bcdSBarry Smith   PetscTryTypeMethod(part, reset);
219abe9303eSLisandro Dalcin   PetscFunctionReturn(0);
220abe9303eSLisandro Dalcin }
221abe9303eSLisandro Dalcin 
222abe9303eSLisandro Dalcin /*@
223abe9303eSLisandro Dalcin   PetscPartitionerDestroy - Destroys a PetscPartitioner object
224abe9303eSLisandro Dalcin 
225abe9303eSLisandro Dalcin   Collective on PetscPartitioner
226abe9303eSLisandro Dalcin 
227abe9303eSLisandro Dalcin   Input Parameter:
228abe9303eSLisandro Dalcin . part - the PetscPartitioner object to destroy
229abe9303eSLisandro Dalcin 
230abe9303eSLisandro Dalcin   Level: developer
231abe9303eSLisandro Dalcin 
232db781477SPatrick Sanan .seealso: `PetscPartitionerView()`
233abe9303eSLisandro Dalcin @*/
234*9371c9d4SSatish Balay PetscErrorCode PetscPartitionerDestroy(PetscPartitioner *part) {
235abe9303eSLisandro Dalcin   PetscFunctionBegin;
236abe9303eSLisandro Dalcin   if (!*part) PetscFunctionReturn(0);
237abe9303eSLisandro Dalcin   PetscValidHeaderSpecific((*part), PETSCPARTITIONER_CLASSID, 1);
238abe9303eSLisandro Dalcin 
239*9371c9d4SSatish Balay   if (--((PetscObject)(*part))->refct > 0) {
240*9371c9d4SSatish Balay     *part = NULL;
241*9371c9d4SSatish Balay     PetscFunctionReturn(0);
242*9371c9d4SSatish Balay   }
243abe9303eSLisandro Dalcin   ((PetscObject)(*part))->refct = 0;
244abe9303eSLisandro Dalcin 
2459566063dSJacob Faibussowitsch   PetscCall(PetscPartitionerReset(*part));
246abe9303eSLisandro Dalcin 
2479566063dSJacob Faibussowitsch   PetscCall(PetscViewerDestroy(&(*part)->viewer));
2489566063dSJacob Faibussowitsch   PetscCall(PetscViewerDestroy(&(*part)->viewerGraph));
249dbbe0bcdSBarry Smith   PetscTryTypeMethod((*part), destroy);
2509566063dSJacob Faibussowitsch   PetscCall(PetscHeaderDestroy(part));
251abe9303eSLisandro Dalcin   PetscFunctionReturn(0);
252abe9303eSLisandro Dalcin }
253abe9303eSLisandro Dalcin 
254abe9303eSLisandro Dalcin /*@
255abe9303eSLisandro Dalcin   PetscPartitionerPartition - Partition a graph
256abe9303eSLisandro Dalcin 
257abe9303eSLisandro Dalcin   Collective on PetscPartitioner
258abe9303eSLisandro Dalcin 
259abe9303eSLisandro Dalcin   Input Parameters:
260abe9303eSLisandro Dalcin + part    - The PetscPartitioner
261abe9303eSLisandro Dalcin . nparts  - Number of partitions
262abe9303eSLisandro Dalcin . numVertices - Number of vertices in the local part of the graph
263abe9303eSLisandro Dalcin . start - row pointers for the local part of the graph (CSR style)
264abe9303eSLisandro Dalcin . adjacency - adjacency list (CSR style)
265abe9303eSLisandro Dalcin . vertexSection - PetscSection describing the absolute weight of each local vertex (can be NULL)
266abe9303eSLisandro Dalcin - targetSection - PetscSection describing the absolute weight of each partition (can be NULL)
267abe9303eSLisandro Dalcin 
268abe9303eSLisandro Dalcin   Output Parameters:
269abe9303eSLisandro Dalcin + partSection     - The PetscSection giving the division of points by partition
270abe9303eSLisandro Dalcin - partition       - The list of points by partition
271abe9303eSLisandro Dalcin 
272abe9303eSLisandro Dalcin   Options Database:
273abe9303eSLisandro Dalcin + -petscpartitioner_view - View the partitioner information
274abe9303eSLisandro Dalcin - -petscpartitioner_view_graph - View the graph we are partitioning
275abe9303eSLisandro Dalcin 
276abe9303eSLisandro Dalcin   Notes:
277abe9303eSLisandro Dalcin     The chart of the vertexSection (if present) must contain [0,numVertices), with the number of dofs in the section specifying the absolute weight for each vertex.
278abe9303eSLisandro Dalcin     The chart of the targetSection (if present) must contain [0,nparts), with the number of dofs in the section specifying the absolute weight for each partition. This information must be the same across processes, PETSc does not check it.
279abe9303eSLisandro Dalcin 
280abe9303eSLisandro Dalcin   Level: developer
281abe9303eSLisandro Dalcin 
282db781477SPatrick Sanan .seealso `PetscPartitionerCreate()`, `PetscPartitionerSetType()`, `PetscSectionCreate()`, `PetscSectionSetChart()`, `PetscSectionSetDof()`
283abe9303eSLisandro Dalcin @*/
284*9371c9d4SSatish Balay PetscErrorCode PetscPartitionerPartition(PetscPartitioner part, PetscInt nparts, PetscInt numVertices, PetscInt start[], PetscInt adjacency[], PetscSection vertexSection, PetscSection targetSection, PetscSection partSection, IS *partition) {
285abe9303eSLisandro Dalcin   PetscFunctionBegin;
286abe9303eSLisandro Dalcin   PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1);
287abe9303eSLisandro Dalcin   PetscValidLogicalCollectiveInt(part, nparts, 2);
28808401ef6SPierre Jolivet   PetscCheck(nparts > 0, PetscObjectComm((PetscObject)part), PETSC_ERR_ARG_OUTOFRANGE, "Number of parts must be positive");
28908401ef6SPierre Jolivet   PetscCheck(numVertices >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Number of vertices must be non-negative");
290abe9303eSLisandro Dalcin   if (numVertices && !part->noGraph) {
291abe9303eSLisandro Dalcin     PetscValidIntPointer(start, 4);
292abe9303eSLisandro Dalcin     PetscValidIntPointer(start + numVertices, 4);
293abe9303eSLisandro Dalcin     if (start[numVertices]) PetscValidIntPointer(adjacency, 5);
294abe9303eSLisandro Dalcin   }
295abe9303eSLisandro Dalcin   if (vertexSection) {
296abe9303eSLisandro Dalcin     PetscInt s, e;
297abe9303eSLisandro Dalcin 
298abe9303eSLisandro Dalcin     PetscValidHeaderSpecific(vertexSection, PETSC_SECTION_CLASSID, 6);
2999566063dSJacob Faibussowitsch     PetscCall(PetscSectionGetChart(vertexSection, &s, &e));
3001dca8a05SBarry Smith     PetscCheck(s <= 0 && e >= numVertices, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Invalid vertexSection chart [%" PetscInt_FMT ",%" PetscInt_FMT ")", s, e);
301abe9303eSLisandro Dalcin   }
302abe9303eSLisandro Dalcin   if (targetSection) {
303abe9303eSLisandro Dalcin     PetscInt s, e;
304abe9303eSLisandro Dalcin 
305abe9303eSLisandro Dalcin     PetscValidHeaderSpecific(targetSection, PETSC_SECTION_CLASSID, 7);
3069566063dSJacob Faibussowitsch     PetscCall(PetscSectionGetChart(targetSection, &s, &e));
3071dca8a05SBarry Smith     PetscCheck(s <= 0 && e >= nparts, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Invalid targetSection chart [%" PetscInt_FMT ",%" PetscInt_FMT ")", s, e);
308abe9303eSLisandro Dalcin   }
309abe9303eSLisandro Dalcin   PetscValidHeaderSpecific(partSection, PETSC_SECTION_CLASSID, 8);
310abe9303eSLisandro Dalcin   PetscValidPointer(partition, 9);
311abe9303eSLisandro Dalcin 
3129566063dSJacob Faibussowitsch   PetscCall(PetscSectionReset(partSection));
3139566063dSJacob Faibussowitsch   PetscCall(PetscSectionSetChart(partSection, 0, nparts));
314abe9303eSLisandro Dalcin   if (nparts == 1) { /* quick */
3159566063dSJacob Faibussowitsch     PetscCall(PetscSectionSetDof(partSection, 0, numVertices));
3169566063dSJacob Faibussowitsch     PetscCall(ISCreateStride(PetscObjectComm((PetscObject)part), numVertices, 0, 1, partition));
317dbbe0bcdSBarry Smith   } else PetscUseTypeMethod(part, partition, nparts, numVertices, start, adjacency, vertexSection, targetSection, partSection, partition);
3189566063dSJacob Faibussowitsch   PetscCall(PetscSectionSetUp(partSection));
319abe9303eSLisandro Dalcin   if (part->viewerGraph) {
320abe9303eSLisandro Dalcin     PetscViewer viewer = part->viewerGraph;
321abe9303eSLisandro Dalcin     PetscBool   isascii;
322abe9303eSLisandro Dalcin     PetscInt    v, i;
323abe9303eSLisandro Dalcin     PetscMPIInt rank;
324abe9303eSLisandro Dalcin 
3259566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)viewer), &rank));
3269566063dSJacob Faibussowitsch     PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii));
327abe9303eSLisandro Dalcin     if (isascii) {
3289566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPushSynchronized(viewer));
32963a3b9bcSJacob Faibussowitsch       PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d]Nv: %" PetscInt_FMT "\n", rank, numVertices));
330abe9303eSLisandro Dalcin       for (v = 0; v < numVertices; ++v) {
331abe9303eSLisandro Dalcin         const PetscInt s = start[v];
332abe9303eSLisandro Dalcin         const PetscInt e = start[v + 1];
333abe9303eSLisandro Dalcin 
3349566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d]  ", rank));
33563a3b9bcSJacob Faibussowitsch         for (i = s; i < e; ++i) PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "%" PetscInt_FMT " ", adjacency[i]));
33663a3b9bcSJacob Faibussowitsch         PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%" PetscInt_FMT "-%" PetscInt_FMT ")\n", s, e));
337abe9303eSLisandro Dalcin       }
3389566063dSJacob Faibussowitsch       PetscCall(PetscViewerFlush(viewer));
3399566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPopSynchronized(viewer));
340abe9303eSLisandro Dalcin     }
341abe9303eSLisandro Dalcin   }
3421baa6e33SBarry Smith   if (part->viewer) PetscCall(PetscPartitionerView(part, part->viewer));
343abe9303eSLisandro Dalcin   PetscFunctionReturn(0);
344abe9303eSLisandro Dalcin }
345abe9303eSLisandro Dalcin 
346abe9303eSLisandro Dalcin /*@
347abe9303eSLisandro Dalcin   PetscPartitionerCreate - Creates an empty PetscPartitioner object. The type can then be set with PetscPartitionerSetType().
348abe9303eSLisandro Dalcin 
349abe9303eSLisandro Dalcin   Collective
350abe9303eSLisandro Dalcin 
351abe9303eSLisandro Dalcin   Input Parameter:
352abe9303eSLisandro Dalcin . comm - The communicator for the PetscPartitioner object
353abe9303eSLisandro Dalcin 
354abe9303eSLisandro Dalcin   Output Parameter:
355abe9303eSLisandro Dalcin . part - The PetscPartitioner object
356abe9303eSLisandro Dalcin 
357abe9303eSLisandro Dalcin   Level: beginner
358abe9303eSLisandro Dalcin 
359db781477SPatrick Sanan .seealso: `PetscPartitionerSetType()`, `PetscPartitionerDestroy()`
360abe9303eSLisandro Dalcin @*/
361*9371c9d4SSatish Balay PetscErrorCode PetscPartitionerCreate(MPI_Comm comm, PetscPartitioner *part) {
362abe9303eSLisandro Dalcin   PetscPartitioner p;
363abe9303eSLisandro Dalcin   const char      *partitionerType = NULL;
364abe9303eSLisandro Dalcin 
365abe9303eSLisandro Dalcin   PetscFunctionBegin;
366abe9303eSLisandro Dalcin   PetscValidPointer(part, 2);
367abe9303eSLisandro Dalcin   *part = NULL;
3689566063dSJacob Faibussowitsch   PetscCall(PetscPartitionerInitializePackage());
369abe9303eSLisandro Dalcin 
3709566063dSJacob Faibussowitsch   PetscCall(PetscHeaderCreate(p, PETSCPARTITIONER_CLASSID, "PetscPartitioner", "Graph Partitioner", "PetscPartitioner", comm, PetscPartitionerDestroy, PetscPartitionerView));
3719566063dSJacob Faibussowitsch   PetscCall(PetscPartitionerGetDefaultType(comm, &partitionerType));
3729566063dSJacob Faibussowitsch   PetscCall(PetscPartitionerSetType(p, partitionerType));
373abe9303eSLisandro Dalcin 
374abe9303eSLisandro Dalcin   p->edgeCut = 0;
375abe9303eSLisandro Dalcin   p->balance = 0.0;
376abe9303eSLisandro Dalcin   p->usevwgt = PETSC_TRUE;
377abe9303eSLisandro Dalcin 
378abe9303eSLisandro Dalcin   *part = p;
379abe9303eSLisandro Dalcin   PetscFunctionReturn(0);
380abe9303eSLisandro Dalcin }
381