xref: /petsc/src/dm/partitioner/interface/partitioner.c (revision a4e35b1925eceef64945ea472b84f2bf06a67b5e)
1abe9303eSLisandro Dalcin #include <petsc/private/partitionerimpl.h> /*I "petscpartitioner.h" I*/
2abe9303eSLisandro Dalcin 
3abe9303eSLisandro Dalcin /*@C
420f4b53cSBarry Smith   PetscPartitionerSetType - Builds a particular `PetscPartitioner`
5abe9303eSLisandro Dalcin 
620f4b53cSBarry Smith   Collective
7abe9303eSLisandro Dalcin 
8abe9303eSLisandro Dalcin   Input Parameters:
920f4b53cSBarry Smith + part - The `PetscPartitioner` object
10abe9303eSLisandro Dalcin - name - The kind of partitioner
11abe9303eSLisandro Dalcin 
12abe9303eSLisandro Dalcin   Options Database Key:
1320f4b53cSBarry Smith . -petscpartitioner_type <type> - Sets the `PetscPartitioner` type
146e0dc72eSMatthew G. Knepley 
15abe9303eSLisandro Dalcin   Level: intermediate
16abe9303eSLisandro Dalcin 
1720f4b53cSBarry Smith   Note:
1820f4b53cSBarry Smith .vb
1920f4b53cSBarry Smith  PETSCPARTITIONERCHACO    - The Chaco partitioner (--download-chaco)
2020f4b53cSBarry Smith  PETSCPARTITIONERPARMETIS - The ParMetis partitioner (--download-parmetis)
2120f4b53cSBarry Smith  PETSCPARTITIONERSHELL    - A shell partitioner implemented by the user
2220f4b53cSBarry Smith  PETSCPARTITIONERSIMPLE   - A simple partitioner that divides cells into equal, contiguous chunks
2320f4b53cSBarry Smith  PETSCPARTITIONERGATHER   - Gathers all cells onto process 0
2420f4b53cSBarry Smith .ve
2520f4b53cSBarry Smith 
26db781477SPatrick Sanan .seealso: `PetscPartitionerGetType()`, `PetscPartitionerCreate()`
27abe9303eSLisandro Dalcin @*/
28d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerSetType(PetscPartitioner part, PetscPartitionerType name)
29d71ae5a4SJacob Faibussowitsch {
30abe9303eSLisandro Dalcin   PetscErrorCode (*r)(PetscPartitioner);
31abe9303eSLisandro Dalcin   PetscBool match;
32abe9303eSLisandro Dalcin 
33abe9303eSLisandro Dalcin   PetscFunctionBegin;
34abe9303eSLisandro Dalcin   PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1);
359566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)part, name, &match));
363ba16761SJacob Faibussowitsch   if (match) PetscFunctionReturn(PETSC_SUCCESS);
37abe9303eSLisandro Dalcin 
389566063dSJacob Faibussowitsch   PetscCall(PetscPartitionerRegisterAll());
399566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListFind(PetscPartitionerList, name, &r));
4028b400f6SJacob Faibussowitsch   PetscCheck(r, PetscObjectComm((PetscObject)part), PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown PetscPartitioner type: %s", name);
41abe9303eSLisandro Dalcin 
42dbbe0bcdSBarry Smith   PetscTryTypeMethod(part, destroy);
43abe9303eSLisandro Dalcin   part->noGraph = PETSC_FALSE;
449566063dSJacob Faibussowitsch   PetscCall(PetscMemzero(part->ops, sizeof(*part->ops)));
459566063dSJacob Faibussowitsch   PetscCall(PetscObjectChangeTypeName((PetscObject)part, name));
469566063dSJacob Faibussowitsch   PetscCall((*r)(part));
473ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
48abe9303eSLisandro Dalcin }
49abe9303eSLisandro Dalcin 
50abe9303eSLisandro Dalcin /*@C
51abe9303eSLisandro Dalcin   PetscPartitionerGetType - Gets the PetscPartitioner type name (as a string) from the object.
52abe9303eSLisandro Dalcin 
53abe9303eSLisandro Dalcin   Not Collective
54abe9303eSLisandro Dalcin 
55abe9303eSLisandro Dalcin   Input Parameter:
56abe9303eSLisandro Dalcin . part - The PetscPartitioner
57abe9303eSLisandro Dalcin 
58abe9303eSLisandro Dalcin   Output Parameter:
59abe9303eSLisandro Dalcin . name - The PetscPartitioner type name
60abe9303eSLisandro Dalcin 
61abe9303eSLisandro Dalcin   Level: intermediate
62abe9303eSLisandro Dalcin 
63db781477SPatrick Sanan .seealso: `PetscPartitionerSetType()`, `PetscPartitionerCreate()`
64abe9303eSLisandro Dalcin @*/
65d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerGetType(PetscPartitioner part, PetscPartitionerType *name)
66d71ae5a4SJacob Faibussowitsch {
67abe9303eSLisandro Dalcin   PetscFunctionBegin;
68abe9303eSLisandro Dalcin   PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1);
694f572ea9SToby Isaac   PetscAssertPointer(name, 2);
70abe9303eSLisandro Dalcin   *name = ((PetscObject)part)->type_name;
713ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
72abe9303eSLisandro Dalcin }
73abe9303eSLisandro Dalcin 
74abe9303eSLisandro Dalcin /*@C
7520f4b53cSBarry Smith   PetscPartitionerViewFromOptions - View a `PetscPartitioner` object based on options in the options database
76abe9303eSLisandro Dalcin 
7720f4b53cSBarry Smith   Collective
78abe9303eSLisandro Dalcin 
79abe9303eSLisandro Dalcin   Input Parameters:
8020f4b53cSBarry Smith + A    - the `PetscPartitioner` object
8120f4b53cSBarry Smith . obj  - Optional `PetscObject` that provides the options prefix
82abe9303eSLisandro Dalcin - name - command line option
83abe9303eSLisandro Dalcin 
84abe9303eSLisandro Dalcin   Level: intermediate
8520f4b53cSBarry Smith 
8620f4b53cSBarry Smith   Note:
8720f4b53cSBarry Smith   See `PetscObjectViewFromOptions()` for the various forms of viewers that may be used
8820f4b53cSBarry Smith 
89db781477SPatrick Sanan .seealso: `PetscPartitionerView()`, `PetscObjectViewFromOptions()`
90abe9303eSLisandro Dalcin @*/
91d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerViewFromOptions(PetscPartitioner A, PetscObject obj, const char name[])
92d71ae5a4SJacob Faibussowitsch {
93abe9303eSLisandro Dalcin   PetscFunctionBegin;
94abe9303eSLisandro Dalcin   PetscValidHeaderSpecific(A, PETSCPARTITIONER_CLASSID, 1);
959566063dSJacob Faibussowitsch   PetscCall(PetscObjectViewFromOptions((PetscObject)A, obj, name));
963ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
97abe9303eSLisandro Dalcin }
98abe9303eSLisandro Dalcin 
99abe9303eSLisandro Dalcin /*@
10020f4b53cSBarry Smith   PetscPartitionerView - Views a `PetscPartitioner`
101abe9303eSLisandro Dalcin 
10220f4b53cSBarry Smith   Collective
103abe9303eSLisandro Dalcin 
104d8d19677SJose E. Roman   Input Parameters:
10520f4b53cSBarry Smith + part - the `PetscPartitioner` object to view
106abe9303eSLisandro Dalcin - v    - the viewer
107abe9303eSLisandro Dalcin 
108abe9303eSLisandro Dalcin   Level: developer
109abe9303eSLisandro Dalcin 
110db781477SPatrick Sanan .seealso: `PetscPartitionerDestroy()`
111abe9303eSLisandro Dalcin @*/
112d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerView(PetscPartitioner part, PetscViewer v)
113d71ae5a4SJacob Faibussowitsch {
114abe9303eSLisandro Dalcin   PetscMPIInt size;
115abe9303eSLisandro Dalcin   PetscBool   isascii;
116abe9303eSLisandro Dalcin 
117abe9303eSLisandro Dalcin   PetscFunctionBegin;
118abe9303eSLisandro Dalcin   PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1);
1199566063dSJacob Faibussowitsch   if (!v) PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)part), &v));
1209566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERASCII, &isascii));
121abe9303eSLisandro Dalcin   if (isascii) {
1229566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)part), &size));
1239566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(v, "Graph Partitioner: %d MPI Process%s\n", size, size > 1 ? "es" : ""));
1249566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(v, "  type: %s\n", ((PetscObject)part)->type_name));
12563a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(v, "  edge cut: %" PetscInt_FMT "\n", part->edgeCut));
12663a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(v, "  balance: %.2g\n", (double)part->balance));
1279566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(v, "  use vertex weights: %d\n", part->usevwgt));
128abe9303eSLisandro Dalcin   }
129dbbe0bcdSBarry Smith   PetscTryTypeMethod(part, view, v);
1303ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
131abe9303eSLisandro Dalcin }
132abe9303eSLisandro Dalcin 
133d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscPartitionerGetDefaultType(MPI_Comm comm, const char **defaultType)
134d71ae5a4SJacob Faibussowitsch {
135abe9303eSLisandro Dalcin   PetscMPIInt size;
136abe9303eSLisandro Dalcin 
137abe9303eSLisandro Dalcin   PetscFunctionBegin;
1389566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(comm, &size));
139abe9303eSLisandro Dalcin   if (size == 1) {
140abe9303eSLisandro Dalcin     *defaultType = PETSCPARTITIONERSIMPLE;
141abe9303eSLisandro Dalcin   } else {
142abe9303eSLisandro Dalcin #if defined(PETSC_HAVE_PARMETIS)
143abe9303eSLisandro Dalcin     *defaultType = PETSCPARTITIONERPARMETIS;
144abe9303eSLisandro Dalcin #elif defined(PETSC_HAVE_PTSCOTCH)
145abe9303eSLisandro Dalcin     *defaultType = PETSCPARTITIONERPTSCOTCH;
146abe9303eSLisandro Dalcin #elif defined(PETSC_HAVE_CHACO)
147abe9303eSLisandro Dalcin     *defaultType = PETSCPARTITIONERCHACO;
148abe9303eSLisandro Dalcin #else
149abe9303eSLisandro Dalcin     *defaultType = PETSCPARTITIONERSIMPLE;
150abe9303eSLisandro Dalcin #endif
151abe9303eSLisandro Dalcin   }
1523ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
153abe9303eSLisandro Dalcin }
154abe9303eSLisandro Dalcin 
155abe9303eSLisandro Dalcin /*@
15620f4b53cSBarry Smith   PetscPartitionerSetFromOptions - sets parameters in a `PetscPartitioner` from the options database
157abe9303eSLisandro Dalcin 
15820f4b53cSBarry Smith   Collective
159abe9303eSLisandro Dalcin 
160abe9303eSLisandro Dalcin   Input Parameter:
16120f4b53cSBarry Smith . part - the `PetscPartitioner` object to set options for
162abe9303eSLisandro Dalcin 
163abe9303eSLisandro Dalcin   Options Database Keys:
16420f4b53cSBarry Smith + -petscpartitioner_type <type>        - Sets the `PetscPartitioner` type; use -help for a list of available types
165abe9303eSLisandro Dalcin . -petscpartitioner_use_vertex_weights - Uses weights associated with the graph vertices
16620f4b53cSBarry Smith - -petscpartitioner_view_graph         - View the graph each time PetscPartitionerPartition is called. Viewer can be customized, see `PetscOptionsGetViewer()`
167abe9303eSLisandro Dalcin 
168abe9303eSLisandro Dalcin   Level: developer
169abe9303eSLisandro Dalcin 
170db781477SPatrick Sanan .seealso: `PetscPartitionerView()`, `PetscPartitionerSetType()`, `PetscPartitionerPartition()`
171abe9303eSLisandro Dalcin @*/
172d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerSetFromOptions(PetscPartitioner part)
173d71ae5a4SJacob Faibussowitsch {
174d7cc930eSLisandro Dalcin   const char *currentType = NULL;
175abe9303eSLisandro Dalcin   char        name[256];
176abe9303eSLisandro Dalcin   PetscBool   flg;
177abe9303eSLisandro Dalcin 
178abe9303eSLisandro Dalcin   PetscFunctionBegin;
179abe9303eSLisandro Dalcin   PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1);
180d0609cedSBarry Smith   PetscObjectOptionsBegin((PetscObject)part);
1819566063dSJacob Faibussowitsch   PetscCall(PetscPartitionerGetType(part, &currentType));
1829566063dSJacob Faibussowitsch   PetscCall(PetscOptionsFList("-petscpartitioner_type", "Graph partitioner", "PetscPartitionerSetType", PetscPartitionerList, currentType, name, sizeof(name), &flg));
1831baa6e33SBarry Smith   if (flg) PetscCall(PetscPartitionerSetType(part, name));
1849566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-petscpartitioner_use_vertex_weights", "Use vertex weights", "", part->usevwgt, &part->usevwgt, NULL));
185dbbe0bcdSBarry Smith   PetscTryTypeMethod(part, setfromoptions, PetscOptionsObject);
1869566063dSJacob Faibussowitsch   PetscCall(PetscViewerDestroy(&part->viewer));
1879566063dSJacob Faibussowitsch   PetscCall(PetscViewerDestroy(&part->viewerGraph));
1889566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetViewer(((PetscObject)part)->comm, ((PetscObject)part)->options, ((PetscObject)part)->prefix, "-petscpartitioner_view", &part->viewer, NULL, NULL));
1899566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetViewer(((PetscObject)part)->comm, ((PetscObject)part)->options, ((PetscObject)part)->prefix, "-petscpartitioner_view_graph", &part->viewerGraph, NULL, &part->viewGraph));
190abe9303eSLisandro Dalcin   /* process any options handlers added with PetscObjectAddOptionsHandler() */
191dbbe0bcdSBarry Smith   PetscCall(PetscObjectProcessOptionsHandlers((PetscObject)part, PetscOptionsObject));
192d0609cedSBarry Smith   PetscOptionsEnd();
1933ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
194abe9303eSLisandro Dalcin }
195abe9303eSLisandro Dalcin 
196abe9303eSLisandro Dalcin /*@
19720f4b53cSBarry Smith   PetscPartitionerSetUp - Construct data structures for the `PetscPartitioner`
198abe9303eSLisandro Dalcin 
19920f4b53cSBarry Smith   Collective
200abe9303eSLisandro Dalcin 
201abe9303eSLisandro Dalcin   Input Parameter:
20220f4b53cSBarry Smith . part - the `PetscPartitioner` object to setup
203abe9303eSLisandro Dalcin 
204abe9303eSLisandro Dalcin   Level: developer
205abe9303eSLisandro Dalcin 
206db781477SPatrick Sanan .seealso: `PetscPartitionerView()`, `PetscPartitionerDestroy()`
207abe9303eSLisandro Dalcin @*/
208d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerSetUp(PetscPartitioner part)
209d71ae5a4SJacob Faibussowitsch {
210abe9303eSLisandro Dalcin   PetscFunctionBegin;
211abe9303eSLisandro Dalcin   PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1);
212dbbe0bcdSBarry Smith   PetscTryTypeMethod(part, setup);
2133ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
214abe9303eSLisandro Dalcin }
215abe9303eSLisandro Dalcin 
216abe9303eSLisandro Dalcin /*@
21720f4b53cSBarry Smith   PetscPartitionerReset - Resets data structures for the `PetscPartitioner`
218abe9303eSLisandro Dalcin 
21920f4b53cSBarry Smith   Collective
220abe9303eSLisandro Dalcin 
221abe9303eSLisandro Dalcin   Input Parameter:
22220f4b53cSBarry Smith . part - the `PetscPartitioner` object to reset
223abe9303eSLisandro Dalcin 
224abe9303eSLisandro Dalcin   Level: developer
225abe9303eSLisandro Dalcin 
226db781477SPatrick Sanan .seealso: `PetscPartitionerSetUp()`, `PetscPartitionerDestroy()`
227abe9303eSLisandro Dalcin @*/
228d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerReset(PetscPartitioner part)
229d71ae5a4SJacob Faibussowitsch {
230abe9303eSLisandro Dalcin   PetscFunctionBegin;
231abe9303eSLisandro Dalcin   PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1);
232dbbe0bcdSBarry Smith   PetscTryTypeMethod(part, reset);
2333ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
234abe9303eSLisandro Dalcin }
235abe9303eSLisandro Dalcin 
236abe9303eSLisandro Dalcin /*@
23720f4b53cSBarry Smith   PetscPartitionerDestroy - Destroys a `PetscPartitioner` object
238abe9303eSLisandro Dalcin 
23920f4b53cSBarry Smith   Collective
240abe9303eSLisandro Dalcin 
241abe9303eSLisandro Dalcin   Input Parameter:
24220f4b53cSBarry Smith . part - the `PetscPartitioner` object to destroy
243abe9303eSLisandro Dalcin 
244abe9303eSLisandro Dalcin   Level: developer
245abe9303eSLisandro Dalcin 
246db781477SPatrick Sanan .seealso: `PetscPartitionerView()`
247abe9303eSLisandro Dalcin @*/
248d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerDestroy(PetscPartitioner *part)
249d71ae5a4SJacob Faibussowitsch {
250abe9303eSLisandro Dalcin   PetscFunctionBegin;
2513ba16761SJacob Faibussowitsch   if (!*part) PetscFunctionReturn(PETSC_SUCCESS);
252abe9303eSLisandro Dalcin   PetscValidHeaderSpecific((*part), PETSCPARTITIONER_CLASSID, 1);
253abe9303eSLisandro Dalcin 
2549371c9d4SSatish Balay   if (--((PetscObject)(*part))->refct > 0) {
2559371c9d4SSatish Balay     *part = NULL;
2563ba16761SJacob Faibussowitsch     PetscFunctionReturn(PETSC_SUCCESS);
2579371c9d4SSatish Balay   }
258abe9303eSLisandro Dalcin   ((PetscObject)(*part))->refct = 0;
259abe9303eSLisandro Dalcin 
2609566063dSJacob Faibussowitsch   PetscCall(PetscPartitionerReset(*part));
261abe9303eSLisandro Dalcin 
2629566063dSJacob Faibussowitsch   PetscCall(PetscViewerDestroy(&(*part)->viewer));
2639566063dSJacob Faibussowitsch   PetscCall(PetscViewerDestroy(&(*part)->viewerGraph));
264dbbe0bcdSBarry Smith   PetscTryTypeMethod((*part), destroy);
2659566063dSJacob Faibussowitsch   PetscCall(PetscHeaderDestroy(part));
2663ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
267abe9303eSLisandro Dalcin }
268abe9303eSLisandro Dalcin 
269abe9303eSLisandro Dalcin /*@
270abe9303eSLisandro Dalcin   PetscPartitionerPartition - Partition a graph
271abe9303eSLisandro Dalcin 
27220f4b53cSBarry Smith   Collective
273abe9303eSLisandro Dalcin 
274abe9303eSLisandro Dalcin   Input Parameters:
27520f4b53cSBarry Smith + part          - The `PetscPartitioner`
276abe9303eSLisandro Dalcin . nparts        - Number of partitions
277abe9303eSLisandro Dalcin . numVertices   - Number of vertices in the local part of the graph
278abe9303eSLisandro Dalcin . start         - row pointers for the local part of the graph (CSR style)
279abe9303eSLisandro Dalcin . adjacency     - adjacency list (CSR style)
280abe9303eSLisandro Dalcin . vertexSection - PetscSection describing the absolute weight of each local vertex (can be NULL)
281abe9303eSLisandro Dalcin - targetSection - PetscSection describing the absolute weight of each partition (can be NULL)
282abe9303eSLisandro Dalcin 
283abe9303eSLisandro Dalcin   Output Parameters:
28420f4b53cSBarry Smith + partSection - The `PetscSection` giving the division of points by partition
285abe9303eSLisandro Dalcin - partition   - The list of points by partition
286abe9303eSLisandro Dalcin 
28720f4b53cSBarry Smith   Options Databasen Keys:
288abe9303eSLisandro Dalcin + -petscpartitioner_view       - View the partitioner information
289abe9303eSLisandro Dalcin - -petscpartitioner_view_graph - View the graph we are partitioning
290abe9303eSLisandro Dalcin 
29120f4b53cSBarry Smith   Level: developer
29220f4b53cSBarry Smith 
293abe9303eSLisandro Dalcin   Notes:
294abe9303eSLisandro 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.
295abe9303eSLisandro 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.
296abe9303eSLisandro Dalcin 
297*a4e35b19SJacob Faibussowitsch .seealso: `PetscPartitionerCreate()`, `PetscPartitionerSetType()`, `PetscSectionCreate()`, `PetscSectionSetChart()`, `PetscSectionSetDof()`
298abe9303eSLisandro Dalcin @*/
299d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerPartition(PetscPartitioner part, PetscInt nparts, PetscInt numVertices, PetscInt start[], PetscInt adjacency[], PetscSection vertexSection, PetscSection targetSection, PetscSection partSection, IS *partition)
300d71ae5a4SJacob Faibussowitsch {
301abe9303eSLisandro Dalcin   PetscFunctionBegin;
302abe9303eSLisandro Dalcin   PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1);
303abe9303eSLisandro Dalcin   PetscValidLogicalCollectiveInt(part, nparts, 2);
30408401ef6SPierre Jolivet   PetscCheck(nparts > 0, PetscObjectComm((PetscObject)part), PETSC_ERR_ARG_OUTOFRANGE, "Number of parts must be positive");
30508401ef6SPierre Jolivet   PetscCheck(numVertices >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Number of vertices must be non-negative");
306abe9303eSLisandro Dalcin   if (numVertices && !part->noGraph) {
3074f572ea9SToby Isaac     PetscAssertPointer(start, 4);
3084f572ea9SToby Isaac     PetscAssertPointer(start + numVertices, 4);
3094f572ea9SToby Isaac     if (start[numVertices]) PetscAssertPointer(adjacency, 5);
310abe9303eSLisandro Dalcin   }
311abe9303eSLisandro Dalcin   if (vertexSection) {
312abe9303eSLisandro Dalcin     PetscInt s, e;
313abe9303eSLisandro Dalcin 
314abe9303eSLisandro Dalcin     PetscValidHeaderSpecific(vertexSection, PETSC_SECTION_CLASSID, 6);
3159566063dSJacob Faibussowitsch     PetscCall(PetscSectionGetChart(vertexSection, &s, &e));
3161dca8a05SBarry Smith     PetscCheck(s <= 0 && e >= numVertices, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Invalid vertexSection chart [%" PetscInt_FMT ",%" PetscInt_FMT ")", s, e);
317abe9303eSLisandro Dalcin   }
318abe9303eSLisandro Dalcin   if (targetSection) {
319abe9303eSLisandro Dalcin     PetscInt s, e;
320abe9303eSLisandro Dalcin 
321abe9303eSLisandro Dalcin     PetscValidHeaderSpecific(targetSection, PETSC_SECTION_CLASSID, 7);
3229566063dSJacob Faibussowitsch     PetscCall(PetscSectionGetChart(targetSection, &s, &e));
3231dca8a05SBarry Smith     PetscCheck(s <= 0 && e >= nparts, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Invalid targetSection chart [%" PetscInt_FMT ",%" PetscInt_FMT ")", s, e);
324abe9303eSLisandro Dalcin   }
325abe9303eSLisandro Dalcin   PetscValidHeaderSpecific(partSection, PETSC_SECTION_CLASSID, 8);
3264f572ea9SToby Isaac   PetscAssertPointer(partition, 9);
327abe9303eSLisandro Dalcin 
3289566063dSJacob Faibussowitsch   PetscCall(PetscSectionReset(partSection));
3299566063dSJacob Faibussowitsch   PetscCall(PetscSectionSetChart(partSection, 0, nparts));
330abe9303eSLisandro Dalcin   if (nparts == 1) { /* quick */
3319566063dSJacob Faibussowitsch     PetscCall(PetscSectionSetDof(partSection, 0, numVertices));
3329566063dSJacob Faibussowitsch     PetscCall(ISCreateStride(PetscObjectComm((PetscObject)part), numVertices, 0, 1, partition));
333dbbe0bcdSBarry Smith   } else PetscUseTypeMethod(part, partition, nparts, numVertices, start, adjacency, vertexSection, targetSection, partSection, partition);
3349566063dSJacob Faibussowitsch   PetscCall(PetscSectionSetUp(partSection));
335abe9303eSLisandro Dalcin   if (part->viewerGraph) {
336abe9303eSLisandro Dalcin     PetscViewer viewer = part->viewerGraph;
337abe9303eSLisandro Dalcin     PetscBool   isascii;
338abe9303eSLisandro Dalcin     PetscInt    v, i;
339abe9303eSLisandro Dalcin     PetscMPIInt rank;
340abe9303eSLisandro Dalcin 
3419566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)viewer), &rank));
3429566063dSJacob Faibussowitsch     PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii));
343abe9303eSLisandro Dalcin     if (isascii) {
3449566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPushSynchronized(viewer));
34563a3b9bcSJacob Faibussowitsch       PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d]Nv: %" PetscInt_FMT "\n", rank, numVertices));
346abe9303eSLisandro Dalcin       for (v = 0; v < numVertices; ++v) {
347abe9303eSLisandro Dalcin         const PetscInt s = start[v];
348abe9303eSLisandro Dalcin         const PetscInt e = start[v + 1];
349abe9303eSLisandro Dalcin 
3509566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d]  ", rank));
35163a3b9bcSJacob Faibussowitsch         for (i = s; i < e; ++i) PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "%" PetscInt_FMT " ", adjacency[i]));
35263a3b9bcSJacob Faibussowitsch         PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%" PetscInt_FMT "-%" PetscInt_FMT ")\n", s, e));
353abe9303eSLisandro Dalcin       }
3549566063dSJacob Faibussowitsch       PetscCall(PetscViewerFlush(viewer));
3559566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPopSynchronized(viewer));
356abe9303eSLisandro Dalcin     }
357abe9303eSLisandro Dalcin   }
3581baa6e33SBarry Smith   if (part->viewer) PetscCall(PetscPartitionerView(part, part->viewer));
3593ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
360abe9303eSLisandro Dalcin }
361abe9303eSLisandro Dalcin 
362abe9303eSLisandro Dalcin /*@
36320f4b53cSBarry Smith   PetscPartitionerCreate - Creates an empty `PetscPartitioner` object. The type can then be set with `PetscPartitionerSetType()`.
364abe9303eSLisandro Dalcin 
365abe9303eSLisandro Dalcin   Collective
366abe9303eSLisandro Dalcin 
367abe9303eSLisandro Dalcin   Input Parameter:
36820f4b53cSBarry Smith . comm - The communicator for the `PetscPartitioner` object
369abe9303eSLisandro Dalcin 
370abe9303eSLisandro Dalcin   Output Parameter:
37120f4b53cSBarry Smith . part - The `PetscPartitioner` object
372abe9303eSLisandro Dalcin 
373abe9303eSLisandro Dalcin   Level: beginner
374abe9303eSLisandro Dalcin 
375db781477SPatrick Sanan .seealso: `PetscPartitionerSetType()`, `PetscPartitionerDestroy()`
376abe9303eSLisandro Dalcin @*/
377d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerCreate(MPI_Comm comm, PetscPartitioner *part)
378d71ae5a4SJacob Faibussowitsch {
379abe9303eSLisandro Dalcin   PetscPartitioner p;
380abe9303eSLisandro Dalcin   const char      *partitionerType = NULL;
381abe9303eSLisandro Dalcin 
382abe9303eSLisandro Dalcin   PetscFunctionBegin;
3834f572ea9SToby Isaac   PetscAssertPointer(part, 2);
384abe9303eSLisandro Dalcin   *part = NULL;
3859566063dSJacob Faibussowitsch   PetscCall(PetscPartitionerInitializePackage());
386abe9303eSLisandro Dalcin 
3879566063dSJacob Faibussowitsch   PetscCall(PetscHeaderCreate(p, PETSCPARTITIONER_CLASSID, "PetscPartitioner", "Graph Partitioner", "PetscPartitioner", comm, PetscPartitionerDestroy, PetscPartitionerView));
3889566063dSJacob Faibussowitsch   PetscCall(PetscPartitionerGetDefaultType(comm, &partitionerType));
3899566063dSJacob Faibussowitsch   PetscCall(PetscPartitionerSetType(p, partitionerType));
390abe9303eSLisandro Dalcin 
391abe9303eSLisandro Dalcin   p->edgeCut = 0;
392abe9303eSLisandro Dalcin   p->balance = 0.0;
393abe9303eSLisandro Dalcin   p->usevwgt = PETSC_TRUE;
394abe9303eSLisandro Dalcin 
395abe9303eSLisandro Dalcin   *part = p;
3963ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
397abe9303eSLisandro Dalcin }
398