xref: /petsc/src/dm/partitioner/interface/partitioner.c (revision dbbe0bcd3f3a8fbab5a45420dc06f8387e5764c6)
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 @*/
26abe9303eSLisandro Dalcin PetscErrorCode PetscPartitionerSetType(PetscPartitioner part, PetscPartitionerType name)
27abe9303eSLisandro Dalcin {
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));
34abe9303eSLisandro Dalcin   if (match) PetscFunctionReturn(0);
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 
40*dbbe0bcdSBarry 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));
45abe9303eSLisandro Dalcin   PetscFunctionReturn(0);
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 @*/
63abe9303eSLisandro Dalcin PetscErrorCode PetscPartitionerGetType(PetscPartitioner part, PetscPartitionerType *name)
64abe9303eSLisandro Dalcin {
65abe9303eSLisandro Dalcin   PetscFunctionBegin;
66abe9303eSLisandro Dalcin   PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1);
67abe9303eSLisandro Dalcin   PetscValidPointer(name, 2);
68abe9303eSLisandro Dalcin   *name = ((PetscObject) part)->type_name;
69abe9303eSLisandro Dalcin   PetscFunctionReturn(0);
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 @*/
85abe9303eSLisandro Dalcin PetscErrorCode PetscPartitionerViewFromOptions(PetscPartitioner A,PetscObject obj,const char name[])
86abe9303eSLisandro Dalcin {
87abe9303eSLisandro Dalcin   PetscFunctionBegin;
88abe9303eSLisandro Dalcin   PetscValidHeaderSpecific(A,PETSCPARTITIONER_CLASSID,1);
899566063dSJacob Faibussowitsch   PetscCall(PetscObjectViewFromOptions((PetscObject)A,obj,name));
90abe9303eSLisandro Dalcin   PetscFunctionReturn(0);
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 @*/
106abe9303eSLisandro Dalcin PetscErrorCode PetscPartitionerView(PetscPartitioner part, PetscViewer v)
107abe9303eSLisandro Dalcin {
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   }
123*dbbe0bcdSBarry Smith   PetscTryTypeMethod(part,view, v);
124abe9303eSLisandro Dalcin   PetscFunctionReturn(0);
125abe9303eSLisandro Dalcin }
126abe9303eSLisandro Dalcin 
127d7cc930eSLisandro Dalcin static PetscErrorCode PetscPartitionerGetDefaultType(MPI_Comm comm, const char **defaultType)
128abe9303eSLisandro Dalcin {
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   }
146abe9303eSLisandro Dalcin   PetscFunctionReturn(0);
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 @*/
166abe9303eSLisandro Dalcin PetscErrorCode PetscPartitionerSetFromOptions(PetscPartitioner part)
167abe9303eSLisandro Dalcin {
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));
179*dbbe0bcdSBarry 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() */
185*dbbe0bcdSBarry Smith   PetscCall(PetscObjectProcessOptionsHandlers((PetscObject) part,PetscOptionsObject));
186d0609cedSBarry Smith   PetscOptionsEnd();
187abe9303eSLisandro Dalcin   PetscFunctionReturn(0);
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 @*/
202abe9303eSLisandro Dalcin PetscErrorCode PetscPartitionerSetUp(PetscPartitioner part)
203abe9303eSLisandro Dalcin {
204abe9303eSLisandro Dalcin   PetscFunctionBegin;
205abe9303eSLisandro Dalcin   PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1);
206*dbbe0bcdSBarry Smith   PetscTryTypeMethod(part,setup);
207abe9303eSLisandro Dalcin   PetscFunctionReturn(0);
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 @*/
222abe9303eSLisandro Dalcin PetscErrorCode PetscPartitionerReset(PetscPartitioner part)
223abe9303eSLisandro Dalcin {
224abe9303eSLisandro Dalcin   PetscFunctionBegin;
225abe9303eSLisandro Dalcin   PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1);
226*dbbe0bcdSBarry Smith   PetscTryTypeMethod(part,reset);
227abe9303eSLisandro Dalcin   PetscFunctionReturn(0);
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 @*/
242abe9303eSLisandro Dalcin PetscErrorCode PetscPartitionerDestroy(PetscPartitioner *part)
243abe9303eSLisandro Dalcin {
244abe9303eSLisandro Dalcin   PetscFunctionBegin;
245abe9303eSLisandro Dalcin   if (!*part) PetscFunctionReturn(0);
246abe9303eSLisandro Dalcin   PetscValidHeaderSpecific((*part), PETSCPARTITIONER_CLASSID, 1);
247abe9303eSLisandro Dalcin 
248ea78f98cSLisandro Dalcin   if (--((PetscObject)(*part))->refct > 0) {*part = NULL; PetscFunctionReturn(0);}
249abe9303eSLisandro Dalcin   ((PetscObject) (*part))->refct = 0;
250abe9303eSLisandro Dalcin 
2519566063dSJacob Faibussowitsch   PetscCall(PetscPartitionerReset(*part));
252abe9303eSLisandro Dalcin 
2539566063dSJacob Faibussowitsch   PetscCall(PetscViewerDestroy(&(*part)->viewer));
2549566063dSJacob Faibussowitsch   PetscCall(PetscViewerDestroy(&(*part)->viewerGraph));
255*dbbe0bcdSBarry Smith   PetscTryTypeMethod((*part),destroy);
2569566063dSJacob Faibussowitsch   PetscCall(PetscHeaderDestroy(part));
257abe9303eSLisandro Dalcin   PetscFunctionReturn(0);
258abe9303eSLisandro Dalcin }
259abe9303eSLisandro Dalcin 
260abe9303eSLisandro Dalcin /*@
261abe9303eSLisandro Dalcin   PetscPartitionerPartition - Partition a graph
262abe9303eSLisandro Dalcin 
263abe9303eSLisandro Dalcin   Collective on PetscPartitioner
264abe9303eSLisandro Dalcin 
265abe9303eSLisandro Dalcin   Input Parameters:
266abe9303eSLisandro Dalcin + part    - The PetscPartitioner
267abe9303eSLisandro Dalcin . nparts  - Number of partitions
268abe9303eSLisandro Dalcin . numVertices - Number of vertices in the local part of the graph
269abe9303eSLisandro Dalcin . start - row pointers for the local part of the graph (CSR style)
270abe9303eSLisandro Dalcin . adjacency - adjacency list (CSR style)
271abe9303eSLisandro Dalcin . vertexSection - PetscSection describing the absolute weight of each local vertex (can be NULL)
272abe9303eSLisandro Dalcin - targetSection - PetscSection describing the absolute weight of each partition (can be NULL)
273abe9303eSLisandro Dalcin 
274abe9303eSLisandro Dalcin   Output Parameters:
275abe9303eSLisandro Dalcin + partSection     - The PetscSection giving the division of points by partition
276abe9303eSLisandro Dalcin - partition       - The list of points by partition
277abe9303eSLisandro Dalcin 
278abe9303eSLisandro Dalcin   Options Database:
279abe9303eSLisandro Dalcin + -petscpartitioner_view - View the partitioner information
280abe9303eSLisandro Dalcin - -petscpartitioner_view_graph - View the graph we are partitioning
281abe9303eSLisandro Dalcin 
282abe9303eSLisandro Dalcin   Notes:
283abe9303eSLisandro 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.
284abe9303eSLisandro 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.
285abe9303eSLisandro Dalcin 
286abe9303eSLisandro Dalcin   Level: developer
287abe9303eSLisandro Dalcin 
288db781477SPatrick Sanan .seealso `PetscPartitionerCreate()`, `PetscPartitionerSetType()`, `PetscSectionCreate()`, `PetscSectionSetChart()`, `PetscSectionSetDof()`
289abe9303eSLisandro Dalcin @*/
290abe9303eSLisandro Dalcin PetscErrorCode PetscPartitionerPartition(PetscPartitioner part, PetscInt nparts, PetscInt numVertices, PetscInt start[], PetscInt adjacency[], PetscSection vertexSection, PetscSection targetSection, PetscSection partSection, IS *partition)
291abe9303eSLisandro Dalcin {
292abe9303eSLisandro Dalcin   PetscFunctionBegin;
293abe9303eSLisandro Dalcin   PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1);
294abe9303eSLisandro Dalcin   PetscValidLogicalCollectiveInt(part, nparts, 2);
29508401ef6SPierre Jolivet   PetscCheck(nparts > 0,PetscObjectComm((PetscObject) part), PETSC_ERR_ARG_OUTOFRANGE, "Number of parts must be positive");
29608401ef6SPierre Jolivet   PetscCheck(numVertices >= 0,PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Number of vertices must be non-negative");
297abe9303eSLisandro Dalcin   if (numVertices && !part->noGraph) {
298abe9303eSLisandro Dalcin     PetscValidIntPointer(start, 4);
299abe9303eSLisandro Dalcin     PetscValidIntPointer(start + numVertices, 4);
300abe9303eSLisandro Dalcin     if (start[numVertices]) PetscValidIntPointer(adjacency, 5);
301abe9303eSLisandro Dalcin   }
302abe9303eSLisandro Dalcin   if (vertexSection) {
303abe9303eSLisandro Dalcin     PetscInt s,e;
304abe9303eSLisandro Dalcin 
305abe9303eSLisandro Dalcin     PetscValidHeaderSpecific(vertexSection, PETSC_SECTION_CLASSID, 6);
3069566063dSJacob Faibussowitsch     PetscCall(PetscSectionGetChart(vertexSection, &s, &e));
3071dca8a05SBarry Smith     PetscCheck(s <= 0 && e >= numVertices,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Invalid vertexSection chart [%" PetscInt_FMT ",%" PetscInt_FMT ")",s,e);
308abe9303eSLisandro Dalcin   }
309abe9303eSLisandro Dalcin   if (targetSection) {
310abe9303eSLisandro Dalcin     PetscInt s,e;
311abe9303eSLisandro Dalcin 
312abe9303eSLisandro Dalcin     PetscValidHeaderSpecific(targetSection, PETSC_SECTION_CLASSID, 7);
3139566063dSJacob Faibussowitsch     PetscCall(PetscSectionGetChart(targetSection, &s, &e));
3141dca8a05SBarry Smith     PetscCheck(s <= 0 && e >= nparts,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Invalid targetSection chart [%" PetscInt_FMT ",%" PetscInt_FMT ")",s,e);
315abe9303eSLisandro Dalcin   }
316abe9303eSLisandro Dalcin   PetscValidHeaderSpecific(partSection, PETSC_SECTION_CLASSID, 8);
317abe9303eSLisandro Dalcin   PetscValidPointer(partition, 9);
318abe9303eSLisandro Dalcin 
3199566063dSJacob Faibussowitsch   PetscCall(PetscSectionReset(partSection));
3209566063dSJacob Faibussowitsch   PetscCall(PetscSectionSetChart(partSection, 0, nparts));
321abe9303eSLisandro Dalcin   if (nparts == 1) { /* quick */
3229566063dSJacob Faibussowitsch     PetscCall(PetscSectionSetDof(partSection, 0, numVertices));
3239566063dSJacob Faibussowitsch     PetscCall(ISCreateStride(PetscObjectComm((PetscObject)part),numVertices,0,1,partition));
324*dbbe0bcdSBarry Smith   } else PetscUseTypeMethod(part,partition , nparts, numVertices, start, adjacency, vertexSection, targetSection, partSection, partition);
3259566063dSJacob Faibussowitsch   PetscCall(PetscSectionSetUp(partSection));
326abe9303eSLisandro Dalcin   if (part->viewerGraph) {
327abe9303eSLisandro Dalcin     PetscViewer viewer = part->viewerGraph;
328abe9303eSLisandro Dalcin     PetscBool   isascii;
329abe9303eSLisandro Dalcin     PetscInt    v, i;
330abe9303eSLisandro Dalcin     PetscMPIInt rank;
331abe9303eSLisandro Dalcin 
3329566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject) viewer), &rank));
3339566063dSJacob Faibussowitsch     PetscCall(PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERASCII, &isascii));
334abe9303eSLisandro Dalcin     if (isascii) {
3359566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPushSynchronized(viewer));
33663a3b9bcSJacob Faibussowitsch       PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d]Nv: %" PetscInt_FMT "\n", rank, numVertices));
337abe9303eSLisandro Dalcin       for (v = 0; v < numVertices; ++v) {
338abe9303eSLisandro Dalcin         const PetscInt s = start[v];
339abe9303eSLisandro Dalcin         const PetscInt e = start[v+1];
340abe9303eSLisandro Dalcin 
3419566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d]  ", rank));
34263a3b9bcSJacob Faibussowitsch         for (i = s; i < e; ++i) PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "%" PetscInt_FMT " ", adjacency[i]));
34363a3b9bcSJacob Faibussowitsch         PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%" PetscInt_FMT "-%" PetscInt_FMT ")\n", s, e));
344abe9303eSLisandro Dalcin       }
3459566063dSJacob Faibussowitsch       PetscCall(PetscViewerFlush(viewer));
3469566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPopSynchronized(viewer));
347abe9303eSLisandro Dalcin     }
348abe9303eSLisandro Dalcin   }
3491baa6e33SBarry Smith   if (part->viewer) PetscCall(PetscPartitionerView(part,part->viewer));
350abe9303eSLisandro Dalcin   PetscFunctionReturn(0);
351abe9303eSLisandro Dalcin }
352abe9303eSLisandro Dalcin 
353abe9303eSLisandro Dalcin /*@
354abe9303eSLisandro Dalcin   PetscPartitionerCreate - Creates an empty PetscPartitioner object. The type can then be set with PetscPartitionerSetType().
355abe9303eSLisandro Dalcin 
356abe9303eSLisandro Dalcin   Collective
357abe9303eSLisandro Dalcin 
358abe9303eSLisandro Dalcin   Input Parameter:
359abe9303eSLisandro Dalcin . comm - The communicator for the PetscPartitioner object
360abe9303eSLisandro Dalcin 
361abe9303eSLisandro Dalcin   Output Parameter:
362abe9303eSLisandro Dalcin . part - The PetscPartitioner object
363abe9303eSLisandro Dalcin 
364abe9303eSLisandro Dalcin   Level: beginner
365abe9303eSLisandro Dalcin 
366db781477SPatrick Sanan .seealso: `PetscPartitionerSetType()`, `PetscPartitionerDestroy()`
367abe9303eSLisandro Dalcin @*/
368abe9303eSLisandro Dalcin PetscErrorCode PetscPartitionerCreate(MPI_Comm comm, PetscPartitioner *part)
369abe9303eSLisandro Dalcin {
370abe9303eSLisandro Dalcin   PetscPartitioner p;
371abe9303eSLisandro Dalcin   const char       *partitionerType = NULL;
372abe9303eSLisandro Dalcin 
373abe9303eSLisandro Dalcin   PetscFunctionBegin;
374abe9303eSLisandro Dalcin   PetscValidPointer(part, 2);
375abe9303eSLisandro Dalcin   *part = NULL;
3769566063dSJacob Faibussowitsch   PetscCall(PetscPartitionerInitializePackage());
377abe9303eSLisandro Dalcin 
3789566063dSJacob Faibussowitsch   PetscCall(PetscHeaderCreate(p, PETSCPARTITIONER_CLASSID, "PetscPartitioner", "Graph Partitioner", "PetscPartitioner", comm, PetscPartitionerDestroy, PetscPartitionerView));
3799566063dSJacob Faibussowitsch   PetscCall(PetscPartitionerGetDefaultType(comm, &partitionerType));
3809566063dSJacob Faibussowitsch   PetscCall(PetscPartitionerSetType(p, partitionerType));
381abe9303eSLisandro Dalcin 
382abe9303eSLisandro Dalcin   p->edgeCut = 0;
383abe9303eSLisandro Dalcin   p->balance = 0.0;
384abe9303eSLisandro Dalcin   p->usevwgt = PETSC_TRUE;
385abe9303eSLisandro Dalcin 
386abe9303eSLisandro Dalcin   *part = p;
387abe9303eSLisandro Dalcin   PetscFunctionReturn(0);
388abe9303eSLisandro Dalcin }
389