xref: /petsc/src/dm/partitioner/interface/partitioner.c (revision 3ba1676111f5c958fe6c2729b46ca4d523958bb3)
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 @*/
26d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerSetType(PetscPartitioner part, PetscPartitionerType name)
27d71ae5a4SJacob Faibussowitsch {
28abe9303eSLisandro Dalcin   PetscErrorCode (*r)(PetscPartitioner);
29abe9303eSLisandro Dalcin   PetscBool match;
30abe9303eSLisandro Dalcin 
31abe9303eSLisandro Dalcin   PetscFunctionBegin;
32abe9303eSLisandro Dalcin   PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1);
339566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)part, name, &match));
34*3ba16761SJacob Faibussowitsch   if (match) PetscFunctionReturn(PETSC_SUCCESS);
35abe9303eSLisandro Dalcin 
369566063dSJacob Faibussowitsch   PetscCall(PetscPartitionerRegisterAll());
379566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListFind(PetscPartitionerList, name, &r));
3828b400f6SJacob Faibussowitsch   PetscCheck(r, PetscObjectComm((PetscObject)part), PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown PetscPartitioner type: %s", name);
39abe9303eSLisandro Dalcin 
40dbbe0bcdSBarry Smith   PetscTryTypeMethod(part, destroy);
41abe9303eSLisandro Dalcin   part->noGraph = PETSC_FALSE;
429566063dSJacob Faibussowitsch   PetscCall(PetscMemzero(part->ops, sizeof(*part->ops)));
439566063dSJacob Faibussowitsch   PetscCall(PetscObjectChangeTypeName((PetscObject)part, name));
449566063dSJacob Faibussowitsch   PetscCall((*r)(part));
45*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
46abe9303eSLisandro Dalcin }
47abe9303eSLisandro Dalcin 
48abe9303eSLisandro Dalcin /*@C
49abe9303eSLisandro Dalcin   PetscPartitionerGetType - Gets the PetscPartitioner type name (as a string) from the object.
50abe9303eSLisandro Dalcin 
51abe9303eSLisandro Dalcin   Not Collective
52abe9303eSLisandro Dalcin 
53abe9303eSLisandro Dalcin   Input Parameter:
54abe9303eSLisandro Dalcin . part - The PetscPartitioner
55abe9303eSLisandro Dalcin 
56abe9303eSLisandro Dalcin   Output Parameter:
57abe9303eSLisandro Dalcin . name - The PetscPartitioner type name
58abe9303eSLisandro Dalcin 
59abe9303eSLisandro Dalcin   Level: intermediate
60abe9303eSLisandro Dalcin 
61db781477SPatrick Sanan .seealso: `PetscPartitionerSetType()`, `PetscPartitionerCreate()`
62abe9303eSLisandro Dalcin @*/
63d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerGetType(PetscPartitioner part, PetscPartitionerType *name)
64d71ae5a4SJacob Faibussowitsch {
65abe9303eSLisandro Dalcin   PetscFunctionBegin;
66abe9303eSLisandro Dalcin   PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1);
67abe9303eSLisandro Dalcin   PetscValidPointer(name, 2);
68abe9303eSLisandro Dalcin   *name = ((PetscObject)part)->type_name;
69*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
70abe9303eSLisandro Dalcin }
71abe9303eSLisandro Dalcin 
72abe9303eSLisandro Dalcin /*@C
73abe9303eSLisandro Dalcin    PetscPartitionerViewFromOptions - View from Options
74abe9303eSLisandro Dalcin 
75abe9303eSLisandro Dalcin    Collective on PetscPartitioner
76abe9303eSLisandro Dalcin 
77abe9303eSLisandro Dalcin    Input Parameters:
78abe9303eSLisandro Dalcin +  A - the PetscPartitioner object
79abe9303eSLisandro Dalcin .  obj - Optional object
80abe9303eSLisandro Dalcin -  name - command line option
81abe9303eSLisandro Dalcin 
82abe9303eSLisandro Dalcin    Level: intermediate
83db781477SPatrick Sanan .seealso: `PetscPartitionerView()`, `PetscObjectViewFromOptions()`
84abe9303eSLisandro Dalcin @*/
85d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerViewFromOptions(PetscPartitioner A, PetscObject obj, const char name[])
86d71ae5a4SJacob Faibussowitsch {
87abe9303eSLisandro Dalcin   PetscFunctionBegin;
88abe9303eSLisandro Dalcin   PetscValidHeaderSpecific(A, PETSCPARTITIONER_CLASSID, 1);
899566063dSJacob Faibussowitsch   PetscCall(PetscObjectViewFromOptions((PetscObject)A, obj, name));
90*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
91abe9303eSLisandro Dalcin }
92abe9303eSLisandro Dalcin 
93abe9303eSLisandro Dalcin /*@
94abe9303eSLisandro Dalcin   PetscPartitionerView - Views a PetscPartitioner
95abe9303eSLisandro Dalcin 
96abe9303eSLisandro Dalcin   Collective on PetscPartitioner
97abe9303eSLisandro Dalcin 
98d8d19677SJose E. Roman   Input Parameters:
99abe9303eSLisandro Dalcin + part - the PetscPartitioner object to view
100abe9303eSLisandro Dalcin - v    - the viewer
101abe9303eSLisandro Dalcin 
102abe9303eSLisandro Dalcin   Level: developer
103abe9303eSLisandro Dalcin 
104db781477SPatrick Sanan .seealso: `PetscPartitionerDestroy()`
105abe9303eSLisandro Dalcin @*/
106d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerView(PetscPartitioner part, PetscViewer v)
107d71ae5a4SJacob Faibussowitsch {
108abe9303eSLisandro Dalcin   PetscMPIInt size;
109abe9303eSLisandro Dalcin   PetscBool   isascii;
110abe9303eSLisandro Dalcin 
111abe9303eSLisandro Dalcin   PetscFunctionBegin;
112abe9303eSLisandro Dalcin   PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1);
1139566063dSJacob Faibussowitsch   if (!v) PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)part), &v));
1149566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERASCII, &isascii));
115abe9303eSLisandro Dalcin   if (isascii) {
1169566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)part), &size));
1179566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(v, "Graph Partitioner: %d MPI Process%s\n", size, size > 1 ? "es" : ""));
1189566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(v, "  type: %s\n", ((PetscObject)part)->type_name));
11963a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(v, "  edge cut: %" PetscInt_FMT "\n", part->edgeCut));
12063a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(v, "  balance: %.2g\n", (double)part->balance));
1219566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(v, "  use vertex weights: %d\n", part->usevwgt));
122abe9303eSLisandro Dalcin   }
123dbbe0bcdSBarry Smith   PetscTryTypeMethod(part, view, v);
124*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
125abe9303eSLisandro Dalcin }
126abe9303eSLisandro Dalcin 
127d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscPartitionerGetDefaultType(MPI_Comm comm, const char **defaultType)
128d71ae5a4SJacob Faibussowitsch {
129abe9303eSLisandro Dalcin   PetscMPIInt size;
130abe9303eSLisandro Dalcin 
131abe9303eSLisandro Dalcin   PetscFunctionBegin;
1329566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(comm, &size));
133abe9303eSLisandro Dalcin   if (size == 1) {
134abe9303eSLisandro Dalcin     *defaultType = PETSCPARTITIONERSIMPLE;
135abe9303eSLisandro Dalcin   } else {
136abe9303eSLisandro Dalcin #if defined(PETSC_HAVE_PARMETIS)
137abe9303eSLisandro Dalcin     *defaultType = PETSCPARTITIONERPARMETIS;
138abe9303eSLisandro Dalcin #elif defined(PETSC_HAVE_PTSCOTCH)
139abe9303eSLisandro Dalcin     *defaultType = PETSCPARTITIONERPTSCOTCH;
140abe9303eSLisandro Dalcin #elif defined(PETSC_HAVE_CHACO)
141abe9303eSLisandro Dalcin     *defaultType = PETSCPARTITIONERCHACO;
142abe9303eSLisandro Dalcin #else
143abe9303eSLisandro Dalcin     *defaultType = PETSCPARTITIONERSIMPLE;
144abe9303eSLisandro Dalcin #endif
145abe9303eSLisandro Dalcin   }
146*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
147abe9303eSLisandro Dalcin }
148abe9303eSLisandro Dalcin 
149abe9303eSLisandro Dalcin /*@
150abe9303eSLisandro Dalcin   PetscPartitionerSetFromOptions - sets parameters in a PetscPartitioner from the options database
151abe9303eSLisandro Dalcin 
152abe9303eSLisandro Dalcin   Collective on PetscPartitioner
153abe9303eSLisandro Dalcin 
154abe9303eSLisandro Dalcin   Input Parameter:
155abe9303eSLisandro Dalcin . part - the PetscPartitioner object to set options for
156abe9303eSLisandro Dalcin 
157abe9303eSLisandro Dalcin   Options Database Keys:
158abe9303eSLisandro Dalcin +  -petscpartitioner_type <type> - Sets the PetscPartitioner type; use -help for a list of available types
159abe9303eSLisandro Dalcin .  -petscpartitioner_use_vertex_weights - Uses weights associated with the graph vertices
160abe9303eSLisandro Dalcin -  -petscpartitioner_view_graph - View the graph each time PetscPartitionerPartition is called. Viewer can be customized, see PetscOptionsGetViewer()
161abe9303eSLisandro Dalcin 
162abe9303eSLisandro Dalcin   Level: developer
163abe9303eSLisandro Dalcin 
164db781477SPatrick Sanan .seealso: `PetscPartitionerView()`, `PetscPartitionerSetType()`, `PetscPartitionerPartition()`
165abe9303eSLisandro Dalcin @*/
166d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerSetFromOptions(PetscPartitioner part)
167d71ae5a4SJacob Faibussowitsch {
168d7cc930eSLisandro Dalcin   const char *currentType = NULL;
169abe9303eSLisandro Dalcin   char        name[256];
170abe9303eSLisandro Dalcin   PetscBool   flg;
171abe9303eSLisandro Dalcin 
172abe9303eSLisandro Dalcin   PetscFunctionBegin;
173abe9303eSLisandro Dalcin   PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1);
174d0609cedSBarry Smith   PetscObjectOptionsBegin((PetscObject)part);
1759566063dSJacob Faibussowitsch   PetscCall(PetscPartitionerGetType(part, &currentType));
1769566063dSJacob Faibussowitsch   PetscCall(PetscOptionsFList("-petscpartitioner_type", "Graph partitioner", "PetscPartitionerSetType", PetscPartitionerList, currentType, name, sizeof(name), &flg));
1771baa6e33SBarry Smith   if (flg) PetscCall(PetscPartitionerSetType(part, name));
1789566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-petscpartitioner_use_vertex_weights", "Use vertex weights", "", part->usevwgt, &part->usevwgt, NULL));
179dbbe0bcdSBarry Smith   PetscTryTypeMethod(part, setfromoptions, PetscOptionsObject);
1809566063dSJacob Faibussowitsch   PetscCall(PetscViewerDestroy(&part->viewer));
1819566063dSJacob Faibussowitsch   PetscCall(PetscViewerDestroy(&part->viewerGraph));
1829566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetViewer(((PetscObject)part)->comm, ((PetscObject)part)->options, ((PetscObject)part)->prefix, "-petscpartitioner_view", &part->viewer, NULL, NULL));
1839566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetViewer(((PetscObject)part)->comm, ((PetscObject)part)->options, ((PetscObject)part)->prefix, "-petscpartitioner_view_graph", &part->viewerGraph, NULL, &part->viewGraph));
184abe9303eSLisandro Dalcin   /* process any options handlers added with PetscObjectAddOptionsHandler() */
185dbbe0bcdSBarry Smith   PetscCall(PetscObjectProcessOptionsHandlers((PetscObject)part, PetscOptionsObject));
186d0609cedSBarry Smith   PetscOptionsEnd();
187*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
188abe9303eSLisandro Dalcin }
189abe9303eSLisandro Dalcin 
190abe9303eSLisandro Dalcin /*@
191abe9303eSLisandro Dalcin   PetscPartitionerSetUp - Construct data structures for the PetscPartitioner
192abe9303eSLisandro Dalcin 
193abe9303eSLisandro Dalcin   Collective on PetscPartitioner
194abe9303eSLisandro Dalcin 
195abe9303eSLisandro Dalcin   Input Parameter:
196abe9303eSLisandro Dalcin . part - the PetscPartitioner object to setup
197abe9303eSLisandro Dalcin 
198abe9303eSLisandro Dalcin   Level: developer
199abe9303eSLisandro Dalcin 
200db781477SPatrick Sanan .seealso: `PetscPartitionerView()`, `PetscPartitionerDestroy()`
201abe9303eSLisandro Dalcin @*/
202d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerSetUp(PetscPartitioner part)
203d71ae5a4SJacob Faibussowitsch {
204abe9303eSLisandro Dalcin   PetscFunctionBegin;
205abe9303eSLisandro Dalcin   PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1);
206dbbe0bcdSBarry Smith   PetscTryTypeMethod(part, setup);
207*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
208abe9303eSLisandro Dalcin }
209abe9303eSLisandro Dalcin 
210abe9303eSLisandro Dalcin /*@
211abe9303eSLisandro Dalcin   PetscPartitionerReset - Resets data structures for the PetscPartitioner
212abe9303eSLisandro Dalcin 
213abe9303eSLisandro Dalcin   Collective on PetscPartitioner
214abe9303eSLisandro Dalcin 
215abe9303eSLisandro Dalcin   Input Parameter:
216abe9303eSLisandro Dalcin . part - the PetscPartitioner object to reset
217abe9303eSLisandro Dalcin 
218abe9303eSLisandro Dalcin   Level: developer
219abe9303eSLisandro Dalcin 
220db781477SPatrick Sanan .seealso: `PetscPartitionerSetUp()`, `PetscPartitionerDestroy()`
221abe9303eSLisandro Dalcin @*/
222d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerReset(PetscPartitioner part)
223d71ae5a4SJacob Faibussowitsch {
224abe9303eSLisandro Dalcin   PetscFunctionBegin;
225abe9303eSLisandro Dalcin   PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1);
226dbbe0bcdSBarry Smith   PetscTryTypeMethod(part, reset);
227*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
228abe9303eSLisandro Dalcin }
229abe9303eSLisandro Dalcin 
230abe9303eSLisandro Dalcin /*@
231abe9303eSLisandro Dalcin   PetscPartitionerDestroy - Destroys a PetscPartitioner object
232abe9303eSLisandro Dalcin 
233abe9303eSLisandro Dalcin   Collective on PetscPartitioner
234abe9303eSLisandro Dalcin 
235abe9303eSLisandro Dalcin   Input Parameter:
236abe9303eSLisandro Dalcin . part - the PetscPartitioner object to destroy
237abe9303eSLisandro Dalcin 
238abe9303eSLisandro Dalcin   Level: developer
239abe9303eSLisandro Dalcin 
240db781477SPatrick Sanan .seealso: `PetscPartitionerView()`
241abe9303eSLisandro Dalcin @*/
242d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerDestroy(PetscPartitioner *part)
243d71ae5a4SJacob Faibussowitsch {
244abe9303eSLisandro Dalcin   PetscFunctionBegin;
245*3ba16761SJacob Faibussowitsch   if (!*part) PetscFunctionReturn(PETSC_SUCCESS);
246abe9303eSLisandro Dalcin   PetscValidHeaderSpecific((*part), PETSCPARTITIONER_CLASSID, 1);
247abe9303eSLisandro Dalcin 
2489371c9d4SSatish Balay   if (--((PetscObject)(*part))->refct > 0) {
2499371c9d4SSatish Balay     *part = NULL;
250*3ba16761SJacob Faibussowitsch     PetscFunctionReturn(PETSC_SUCCESS);
2519371c9d4SSatish Balay   }
252abe9303eSLisandro Dalcin   ((PetscObject)(*part))->refct = 0;
253abe9303eSLisandro Dalcin 
2549566063dSJacob Faibussowitsch   PetscCall(PetscPartitionerReset(*part));
255abe9303eSLisandro Dalcin 
2569566063dSJacob Faibussowitsch   PetscCall(PetscViewerDestroy(&(*part)->viewer));
2579566063dSJacob Faibussowitsch   PetscCall(PetscViewerDestroy(&(*part)->viewerGraph));
258dbbe0bcdSBarry Smith   PetscTryTypeMethod((*part), destroy);
2599566063dSJacob Faibussowitsch   PetscCall(PetscHeaderDestroy(part));
260*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
261abe9303eSLisandro Dalcin }
262abe9303eSLisandro Dalcin 
263abe9303eSLisandro Dalcin /*@
264abe9303eSLisandro Dalcin   PetscPartitionerPartition - Partition a graph
265abe9303eSLisandro Dalcin 
266abe9303eSLisandro Dalcin   Collective on PetscPartitioner
267abe9303eSLisandro Dalcin 
268abe9303eSLisandro Dalcin   Input Parameters:
269abe9303eSLisandro Dalcin + part    - The PetscPartitioner
270abe9303eSLisandro Dalcin . nparts  - Number of partitions
271abe9303eSLisandro Dalcin . numVertices - Number of vertices in the local part of the graph
272abe9303eSLisandro Dalcin . start - row pointers for the local part of the graph (CSR style)
273abe9303eSLisandro Dalcin . adjacency - adjacency list (CSR style)
274abe9303eSLisandro Dalcin . vertexSection - PetscSection describing the absolute weight of each local vertex (can be NULL)
275abe9303eSLisandro Dalcin - targetSection - PetscSection describing the absolute weight of each partition (can be NULL)
276abe9303eSLisandro Dalcin 
277abe9303eSLisandro Dalcin   Output Parameters:
278abe9303eSLisandro Dalcin + partSection     - The PetscSection giving the division of points by partition
279abe9303eSLisandro Dalcin - partition       - The list of points by partition
280abe9303eSLisandro Dalcin 
281abe9303eSLisandro Dalcin   Options Database:
282abe9303eSLisandro Dalcin + -petscpartitioner_view - View the partitioner information
283abe9303eSLisandro Dalcin - -petscpartitioner_view_graph - View the graph we are partitioning
284abe9303eSLisandro Dalcin 
285abe9303eSLisandro Dalcin   Notes:
286abe9303eSLisandro 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.
287abe9303eSLisandro 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.
288abe9303eSLisandro Dalcin 
289abe9303eSLisandro Dalcin   Level: developer
290abe9303eSLisandro Dalcin 
291db781477SPatrick Sanan .seealso `PetscPartitionerCreate()`, `PetscPartitionerSetType()`, `PetscSectionCreate()`, `PetscSectionSetChart()`, `PetscSectionSetDof()`
292abe9303eSLisandro Dalcin @*/
293d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerPartition(PetscPartitioner part, PetscInt nparts, PetscInt numVertices, PetscInt start[], PetscInt adjacency[], PetscSection vertexSection, PetscSection targetSection, PetscSection partSection, IS *partition)
294d71ae5a4SJacob Faibussowitsch {
295abe9303eSLisandro Dalcin   PetscFunctionBegin;
296abe9303eSLisandro Dalcin   PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1);
297abe9303eSLisandro Dalcin   PetscValidLogicalCollectiveInt(part, nparts, 2);
29808401ef6SPierre Jolivet   PetscCheck(nparts > 0, PetscObjectComm((PetscObject)part), PETSC_ERR_ARG_OUTOFRANGE, "Number of parts must be positive");
29908401ef6SPierre Jolivet   PetscCheck(numVertices >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Number of vertices must be non-negative");
300abe9303eSLisandro Dalcin   if (numVertices && !part->noGraph) {
301abe9303eSLisandro Dalcin     PetscValidIntPointer(start, 4);
302abe9303eSLisandro Dalcin     PetscValidIntPointer(start + numVertices, 4);
303abe9303eSLisandro Dalcin     if (start[numVertices]) PetscValidIntPointer(adjacency, 5);
304abe9303eSLisandro Dalcin   }
305abe9303eSLisandro Dalcin   if (vertexSection) {
306abe9303eSLisandro Dalcin     PetscInt s, e;
307abe9303eSLisandro Dalcin 
308abe9303eSLisandro Dalcin     PetscValidHeaderSpecific(vertexSection, PETSC_SECTION_CLASSID, 6);
3099566063dSJacob Faibussowitsch     PetscCall(PetscSectionGetChart(vertexSection, &s, &e));
3101dca8a05SBarry Smith     PetscCheck(s <= 0 && e >= numVertices, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Invalid vertexSection chart [%" PetscInt_FMT ",%" PetscInt_FMT ")", s, e);
311abe9303eSLisandro Dalcin   }
312abe9303eSLisandro Dalcin   if (targetSection) {
313abe9303eSLisandro Dalcin     PetscInt s, e;
314abe9303eSLisandro Dalcin 
315abe9303eSLisandro Dalcin     PetscValidHeaderSpecific(targetSection, PETSC_SECTION_CLASSID, 7);
3169566063dSJacob Faibussowitsch     PetscCall(PetscSectionGetChart(targetSection, &s, &e));
3171dca8a05SBarry Smith     PetscCheck(s <= 0 && e >= nparts, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Invalid targetSection chart [%" PetscInt_FMT ",%" PetscInt_FMT ")", s, e);
318abe9303eSLisandro Dalcin   }
319abe9303eSLisandro Dalcin   PetscValidHeaderSpecific(partSection, PETSC_SECTION_CLASSID, 8);
320abe9303eSLisandro Dalcin   PetscValidPointer(partition, 9);
321abe9303eSLisandro Dalcin 
3229566063dSJacob Faibussowitsch   PetscCall(PetscSectionReset(partSection));
3239566063dSJacob Faibussowitsch   PetscCall(PetscSectionSetChart(partSection, 0, nparts));
324abe9303eSLisandro Dalcin   if (nparts == 1) { /* quick */
3259566063dSJacob Faibussowitsch     PetscCall(PetscSectionSetDof(partSection, 0, numVertices));
3269566063dSJacob Faibussowitsch     PetscCall(ISCreateStride(PetscObjectComm((PetscObject)part), numVertices, 0, 1, partition));
327dbbe0bcdSBarry Smith   } else PetscUseTypeMethod(part, partition, nparts, numVertices, start, adjacency, vertexSection, targetSection, partSection, partition);
3289566063dSJacob Faibussowitsch   PetscCall(PetscSectionSetUp(partSection));
329abe9303eSLisandro Dalcin   if (part->viewerGraph) {
330abe9303eSLisandro Dalcin     PetscViewer viewer = part->viewerGraph;
331abe9303eSLisandro Dalcin     PetscBool   isascii;
332abe9303eSLisandro Dalcin     PetscInt    v, i;
333abe9303eSLisandro Dalcin     PetscMPIInt rank;
334abe9303eSLisandro Dalcin 
3359566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)viewer), &rank));
3369566063dSJacob Faibussowitsch     PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii));
337abe9303eSLisandro Dalcin     if (isascii) {
3389566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPushSynchronized(viewer));
33963a3b9bcSJacob Faibussowitsch       PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d]Nv: %" PetscInt_FMT "\n", rank, numVertices));
340abe9303eSLisandro Dalcin       for (v = 0; v < numVertices; ++v) {
341abe9303eSLisandro Dalcin         const PetscInt s = start[v];
342abe9303eSLisandro Dalcin         const PetscInt e = start[v + 1];
343abe9303eSLisandro Dalcin 
3449566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d]  ", rank));
34563a3b9bcSJacob Faibussowitsch         for (i = s; i < e; ++i) PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "%" PetscInt_FMT " ", adjacency[i]));
34663a3b9bcSJacob Faibussowitsch         PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%" PetscInt_FMT "-%" PetscInt_FMT ")\n", s, e));
347abe9303eSLisandro Dalcin       }
3489566063dSJacob Faibussowitsch       PetscCall(PetscViewerFlush(viewer));
3499566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPopSynchronized(viewer));
350abe9303eSLisandro Dalcin     }
351abe9303eSLisandro Dalcin   }
3521baa6e33SBarry Smith   if (part->viewer) PetscCall(PetscPartitionerView(part, part->viewer));
353*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
354abe9303eSLisandro Dalcin }
355abe9303eSLisandro Dalcin 
356abe9303eSLisandro Dalcin /*@
357abe9303eSLisandro Dalcin   PetscPartitionerCreate - Creates an empty PetscPartitioner object. The type can then be set with PetscPartitionerSetType().
358abe9303eSLisandro Dalcin 
359abe9303eSLisandro Dalcin   Collective
360abe9303eSLisandro Dalcin 
361abe9303eSLisandro Dalcin   Input Parameter:
362abe9303eSLisandro Dalcin . comm - The communicator for the PetscPartitioner object
363abe9303eSLisandro Dalcin 
364abe9303eSLisandro Dalcin   Output Parameter:
365abe9303eSLisandro Dalcin . part - The PetscPartitioner object
366abe9303eSLisandro Dalcin 
367abe9303eSLisandro Dalcin   Level: beginner
368abe9303eSLisandro Dalcin 
369db781477SPatrick Sanan .seealso: `PetscPartitionerSetType()`, `PetscPartitionerDestroy()`
370abe9303eSLisandro Dalcin @*/
371d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerCreate(MPI_Comm comm, PetscPartitioner *part)
372d71ae5a4SJacob Faibussowitsch {
373abe9303eSLisandro Dalcin   PetscPartitioner p;
374abe9303eSLisandro Dalcin   const char      *partitionerType = NULL;
375abe9303eSLisandro Dalcin 
376abe9303eSLisandro Dalcin   PetscFunctionBegin;
377abe9303eSLisandro Dalcin   PetscValidPointer(part, 2);
378abe9303eSLisandro Dalcin   *part = NULL;
3799566063dSJacob Faibussowitsch   PetscCall(PetscPartitionerInitializePackage());
380abe9303eSLisandro Dalcin 
3819566063dSJacob Faibussowitsch   PetscCall(PetscHeaderCreate(p, PETSCPARTITIONER_CLASSID, "PetscPartitioner", "Graph Partitioner", "PetscPartitioner", comm, PetscPartitionerDestroy, PetscPartitionerView));
3829566063dSJacob Faibussowitsch   PetscCall(PetscPartitionerGetDefaultType(comm, &partitionerType));
3839566063dSJacob Faibussowitsch   PetscCall(PetscPartitionerSetType(p, partitionerType));
384abe9303eSLisandro Dalcin 
385abe9303eSLisandro Dalcin   p->edgeCut = 0;
386abe9303eSLisandro Dalcin   p->balance = 0.0;
387abe9303eSLisandro Dalcin   p->usevwgt = PETSC_TRUE;
388abe9303eSLisandro Dalcin 
389abe9303eSLisandro Dalcin   *part = p;
390*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
391abe9303eSLisandro Dalcin }
392