xref: /petsc/src/dm/partitioner/interface/partitioner.c (revision 6e0dc72e24f44ef649a0d3e6ff475ddd77f4e9d8)
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 
15*6e0dc72eSMatthew G. Knepley   Note:
16*6e0dc72eSMatthew G. Knepley $ PETSCPARTITIONERCHACO    - The Chaco partitioner (--download-chaco)
17*6e0dc72eSMatthew G. Knepley $ PETSCPARTITIONERPARMETIS - The ParMetis partitioner (--download-parmetis)
18*6e0dc72eSMatthew G. Knepley $ PETSCPARTITIONERSHELL    - A shell partitioner implemented by the user
19*6e0dc72eSMatthew G. Knepley $ PETSCPARTITIONERSIMPLE   - A simple partitioner that divides cells into equal, contiguous chunks
20*6e0dc72eSMatthew G. Knepley $ PETSCPARTITIONERGATHER   - Gathers all cells onto process 0
21*6e0dc72eSMatthew G. Knepley 
22abe9303eSLisandro Dalcin   Level: intermediate
23abe9303eSLisandro Dalcin 
24abe9303eSLisandro Dalcin .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   PetscErrorCode ierr;
31abe9303eSLisandro Dalcin 
32abe9303eSLisandro Dalcin   PetscFunctionBegin;
33abe9303eSLisandro Dalcin   PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1);
34abe9303eSLisandro Dalcin   ierr = PetscObjectTypeCompare((PetscObject) part, name, &match);CHKERRQ(ierr);
35abe9303eSLisandro Dalcin   if (match) PetscFunctionReturn(0);
36abe9303eSLisandro Dalcin 
37abe9303eSLisandro Dalcin   ierr = PetscPartitionerRegisterAll();CHKERRQ(ierr);
38abe9303eSLisandro Dalcin   ierr = PetscFunctionListFind(PetscPartitionerList, name, &r);CHKERRQ(ierr);
392c71b3e2SJacob Faibussowitsch   PetscCheckFalse(!r,PetscObjectComm((PetscObject) part), PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown PetscPartitioner type: %s", name);
40abe9303eSLisandro Dalcin 
41abe9303eSLisandro Dalcin   if (part->ops->destroy) {
42abe9303eSLisandro Dalcin     ierr = (*part->ops->destroy)(part);CHKERRQ(ierr);
43abe9303eSLisandro Dalcin   }
44abe9303eSLisandro Dalcin   part->noGraph = PETSC_FALSE;
45abe9303eSLisandro Dalcin   ierr = PetscMemzero(part->ops, sizeof(*part->ops));CHKERRQ(ierr);
46abe9303eSLisandro Dalcin   ierr = PetscObjectChangeTypeName((PetscObject) part, name);CHKERRQ(ierr);
47abe9303eSLisandro Dalcin   ierr = (*r)(part);CHKERRQ(ierr);
48abe9303eSLisandro Dalcin   PetscFunctionReturn(0);
49abe9303eSLisandro Dalcin }
50abe9303eSLisandro Dalcin 
51abe9303eSLisandro Dalcin /*@C
52abe9303eSLisandro Dalcin   PetscPartitionerGetType - Gets the PetscPartitioner type name (as a string) from the object.
53abe9303eSLisandro Dalcin 
54abe9303eSLisandro Dalcin   Not Collective
55abe9303eSLisandro Dalcin 
56abe9303eSLisandro Dalcin   Input Parameter:
57abe9303eSLisandro Dalcin . part - The PetscPartitioner
58abe9303eSLisandro Dalcin 
59abe9303eSLisandro Dalcin   Output Parameter:
60abe9303eSLisandro Dalcin . name - The PetscPartitioner type name
61abe9303eSLisandro Dalcin 
62abe9303eSLisandro Dalcin   Level: intermediate
63abe9303eSLisandro Dalcin 
64abe9303eSLisandro Dalcin .seealso: PetscPartitionerSetType(), PetscPartitionerCreate()
65abe9303eSLisandro Dalcin @*/
66abe9303eSLisandro Dalcin PetscErrorCode PetscPartitionerGetType(PetscPartitioner part, PetscPartitionerType *name)
67abe9303eSLisandro Dalcin {
68abe9303eSLisandro Dalcin   PetscFunctionBegin;
69abe9303eSLisandro Dalcin   PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1);
70abe9303eSLisandro Dalcin   PetscValidPointer(name, 2);
71abe9303eSLisandro Dalcin   *name = ((PetscObject) part)->type_name;
72abe9303eSLisandro Dalcin   PetscFunctionReturn(0);
73abe9303eSLisandro Dalcin }
74abe9303eSLisandro Dalcin 
75abe9303eSLisandro Dalcin /*@C
76abe9303eSLisandro Dalcin    PetscPartitionerViewFromOptions - View from Options
77abe9303eSLisandro Dalcin 
78abe9303eSLisandro Dalcin    Collective on PetscPartitioner
79abe9303eSLisandro Dalcin 
80abe9303eSLisandro Dalcin    Input Parameters:
81abe9303eSLisandro Dalcin +  A - the PetscPartitioner object
82abe9303eSLisandro Dalcin .  obj - Optional object
83abe9303eSLisandro Dalcin -  name - command line option
84abe9303eSLisandro Dalcin 
85abe9303eSLisandro Dalcin    Level: intermediate
86abe9303eSLisandro Dalcin .seealso:  PetscPartitionerView(), PetscObjectViewFromOptions()
87abe9303eSLisandro Dalcin @*/
88abe9303eSLisandro Dalcin PetscErrorCode PetscPartitionerViewFromOptions(PetscPartitioner A,PetscObject obj,const char name[])
89abe9303eSLisandro Dalcin {
90abe9303eSLisandro Dalcin   PetscErrorCode ierr;
91abe9303eSLisandro Dalcin 
92abe9303eSLisandro Dalcin   PetscFunctionBegin;
93abe9303eSLisandro Dalcin   PetscValidHeaderSpecific(A,PETSCPARTITIONER_CLASSID,1);
94abe9303eSLisandro Dalcin   ierr = PetscObjectViewFromOptions((PetscObject)A,obj,name);CHKERRQ(ierr);
95abe9303eSLisandro Dalcin   PetscFunctionReturn(0);
96abe9303eSLisandro Dalcin }
97abe9303eSLisandro Dalcin 
98abe9303eSLisandro Dalcin /*@
99abe9303eSLisandro Dalcin   PetscPartitionerView - Views a PetscPartitioner
100abe9303eSLisandro Dalcin 
101abe9303eSLisandro Dalcin   Collective on PetscPartitioner
102abe9303eSLisandro Dalcin 
103d8d19677SJose E. Roman   Input Parameters:
104abe9303eSLisandro Dalcin + part - the PetscPartitioner object to view
105abe9303eSLisandro Dalcin - v    - the viewer
106abe9303eSLisandro Dalcin 
107abe9303eSLisandro Dalcin   Level: developer
108abe9303eSLisandro Dalcin 
109abe9303eSLisandro Dalcin .seealso: PetscPartitionerDestroy()
110abe9303eSLisandro Dalcin @*/
111abe9303eSLisandro Dalcin PetscErrorCode PetscPartitionerView(PetscPartitioner part, PetscViewer v)
112abe9303eSLisandro Dalcin {
113abe9303eSLisandro Dalcin   PetscMPIInt    size;
114abe9303eSLisandro Dalcin   PetscBool      isascii;
115abe9303eSLisandro Dalcin   PetscErrorCode ierr;
116abe9303eSLisandro Dalcin 
117abe9303eSLisandro Dalcin   PetscFunctionBegin;
118abe9303eSLisandro Dalcin   PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1);
119abe9303eSLisandro Dalcin   if (!v) {ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject) part), &v);CHKERRQ(ierr);}
120abe9303eSLisandro Dalcin   ierr = PetscObjectTypeCompare((PetscObject) v, PETSCVIEWERASCII, &isascii);CHKERRQ(ierr);
121abe9303eSLisandro Dalcin   if (isascii) {
122ffc4695bSBarry Smith     ierr = MPI_Comm_size(PetscObjectComm((PetscObject) part), &size);CHKERRMPI(ierr);
123abe9303eSLisandro Dalcin     ierr = PetscViewerASCIIPrintf(v, "Graph Partitioner: %d MPI Process%s\n", size, size > 1 ? "es" : "");CHKERRQ(ierr);
124abe9303eSLisandro Dalcin     ierr = PetscViewerASCIIPrintf(v, "  type: %s\n", ((PetscObject)part)->type_name);CHKERRQ(ierr);
125abe9303eSLisandro Dalcin     ierr = PetscViewerASCIIPrintf(v, "  edge cut: %D\n", part->edgeCut);CHKERRQ(ierr);
126abe9303eSLisandro Dalcin     ierr = PetscViewerASCIIPrintf(v, "  balance: %.2g\n", part->balance);CHKERRQ(ierr);
127abe9303eSLisandro Dalcin     ierr = PetscViewerASCIIPrintf(v, "  use vertex weights: %d\n", part->usevwgt);CHKERRQ(ierr);
128abe9303eSLisandro Dalcin   }
129abe9303eSLisandro Dalcin   if (part->ops->view) {ierr = (*part->ops->view)(part, v);CHKERRQ(ierr);}
130abe9303eSLisandro Dalcin   PetscFunctionReturn(0);
131abe9303eSLisandro Dalcin }
132abe9303eSLisandro Dalcin 
133d7cc930eSLisandro Dalcin static PetscErrorCode PetscPartitionerGetDefaultType(MPI_Comm comm, const char **defaultType)
134abe9303eSLisandro Dalcin {
135abe9303eSLisandro Dalcin   PetscMPIInt    size;
136abe9303eSLisandro Dalcin   PetscErrorCode ierr;
137abe9303eSLisandro Dalcin 
138abe9303eSLisandro Dalcin   PetscFunctionBegin;
139ffc4695bSBarry Smith   ierr = MPI_Comm_size(comm, &size);CHKERRMPI(ierr);
140abe9303eSLisandro Dalcin   if (size == 1) {
141abe9303eSLisandro Dalcin     *defaultType = PETSCPARTITIONERSIMPLE;
142abe9303eSLisandro Dalcin   } else {
143abe9303eSLisandro Dalcin #if defined(PETSC_HAVE_PARMETIS)
144abe9303eSLisandro Dalcin     *defaultType = PETSCPARTITIONERPARMETIS;
145abe9303eSLisandro Dalcin #elif defined(PETSC_HAVE_PTSCOTCH)
146abe9303eSLisandro Dalcin     *defaultType = PETSCPARTITIONERPTSCOTCH;
147abe9303eSLisandro Dalcin #elif defined(PETSC_HAVE_CHACO)
148abe9303eSLisandro Dalcin     *defaultType = PETSCPARTITIONERCHACO;
149abe9303eSLisandro Dalcin #else
150abe9303eSLisandro Dalcin     *defaultType = PETSCPARTITIONERSIMPLE;
151abe9303eSLisandro Dalcin #endif
152abe9303eSLisandro Dalcin   }
153abe9303eSLisandro Dalcin   PetscFunctionReturn(0);
154abe9303eSLisandro Dalcin }
155abe9303eSLisandro Dalcin 
156abe9303eSLisandro Dalcin /*@
157abe9303eSLisandro Dalcin   PetscPartitionerSetFromOptions - sets parameters in a PetscPartitioner from the options database
158abe9303eSLisandro Dalcin 
159abe9303eSLisandro Dalcin   Collective on PetscPartitioner
160abe9303eSLisandro Dalcin 
161abe9303eSLisandro Dalcin   Input Parameter:
162abe9303eSLisandro Dalcin . part - the PetscPartitioner object to set options for
163abe9303eSLisandro Dalcin 
164abe9303eSLisandro Dalcin   Options Database Keys:
165abe9303eSLisandro Dalcin +  -petscpartitioner_type <type> - Sets the PetscPartitioner type; use -help for a list of available types
166abe9303eSLisandro Dalcin .  -petscpartitioner_use_vertex_weights - Uses weights associated with the graph vertices
167abe9303eSLisandro Dalcin -  -petscpartitioner_view_graph - View the graph each time PetscPartitionerPartition is called. Viewer can be customized, see PetscOptionsGetViewer()
168abe9303eSLisandro Dalcin 
169abe9303eSLisandro Dalcin   Level: developer
170abe9303eSLisandro Dalcin 
171abe9303eSLisandro Dalcin .seealso: PetscPartitionerView(), PetscPartitionerSetType(), PetscPartitionerPartition()
172abe9303eSLisandro Dalcin @*/
173abe9303eSLisandro Dalcin PetscErrorCode PetscPartitionerSetFromOptions(PetscPartitioner part)
174abe9303eSLisandro Dalcin {
175d7cc930eSLisandro Dalcin   const char    *currentType = NULL;
176abe9303eSLisandro Dalcin   char           name[256];
177abe9303eSLisandro Dalcin   PetscBool      flg;
178abe9303eSLisandro Dalcin   PetscErrorCode ierr;
179abe9303eSLisandro Dalcin 
180abe9303eSLisandro Dalcin   PetscFunctionBegin;
181abe9303eSLisandro Dalcin   PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1);
182abe9303eSLisandro Dalcin   ierr = PetscObjectOptionsBegin((PetscObject) part);CHKERRQ(ierr);
183d7cc930eSLisandro Dalcin   ierr = PetscPartitionerGetType(part, &currentType);CHKERRQ(ierr);
184d7cc930eSLisandro Dalcin   ierr = PetscOptionsFList("-petscpartitioner_type", "Graph partitioner", "PetscPartitionerSetType", PetscPartitionerList, currentType, name, sizeof(name), &flg);CHKERRQ(ierr);
185abe9303eSLisandro Dalcin   if (flg) {
186abe9303eSLisandro Dalcin     ierr = PetscPartitionerSetType(part, name);CHKERRQ(ierr);
187abe9303eSLisandro Dalcin   }
188abe9303eSLisandro Dalcin   ierr = PetscOptionsBool("-petscpartitioner_use_vertex_weights","Use vertex weights","",part->usevwgt,&part->usevwgt,NULL);CHKERRQ(ierr);
189abe9303eSLisandro Dalcin   if (part->ops->setfromoptions) {
190abe9303eSLisandro Dalcin     ierr = (*part->ops->setfromoptions)(PetscOptionsObject,part);CHKERRQ(ierr);
191abe9303eSLisandro Dalcin   }
192abe9303eSLisandro Dalcin   ierr = PetscViewerDestroy(&part->viewer);CHKERRQ(ierr);
193abe9303eSLisandro Dalcin   ierr = PetscViewerDestroy(&part->viewerGraph);CHKERRQ(ierr);
194abe9303eSLisandro Dalcin   ierr = PetscOptionsGetViewer(((PetscObject) part)->comm, ((PetscObject) part)->options, ((PetscObject) part)->prefix, "-petscpartitioner_view", &part->viewer, NULL, NULL);CHKERRQ(ierr);
195abe9303eSLisandro Dalcin   ierr = PetscOptionsGetViewer(((PetscObject) part)->comm, ((PetscObject) part)->options, ((PetscObject) part)->prefix, "-petscpartitioner_view_graph", &part->viewerGraph, NULL, &part->viewGraph);CHKERRQ(ierr);
196abe9303eSLisandro Dalcin   /* process any options handlers added with PetscObjectAddOptionsHandler() */
197abe9303eSLisandro Dalcin   ierr = PetscObjectProcessOptionsHandlers(PetscOptionsObject,(PetscObject) part);CHKERRQ(ierr);
198abe9303eSLisandro Dalcin   ierr = PetscOptionsEnd();CHKERRQ(ierr);
199abe9303eSLisandro Dalcin   PetscFunctionReturn(0);
200abe9303eSLisandro Dalcin }
201abe9303eSLisandro Dalcin 
202abe9303eSLisandro Dalcin /*@
203abe9303eSLisandro Dalcin   PetscPartitionerSetUp - Construct data structures for the PetscPartitioner
204abe9303eSLisandro Dalcin 
205abe9303eSLisandro Dalcin   Collective on PetscPartitioner
206abe9303eSLisandro Dalcin 
207abe9303eSLisandro Dalcin   Input Parameter:
208abe9303eSLisandro Dalcin . part - the PetscPartitioner object to setup
209abe9303eSLisandro Dalcin 
210abe9303eSLisandro Dalcin   Level: developer
211abe9303eSLisandro Dalcin 
212abe9303eSLisandro Dalcin .seealso: PetscPartitionerView(), PetscPartitionerDestroy()
213abe9303eSLisandro Dalcin @*/
214abe9303eSLisandro Dalcin PetscErrorCode PetscPartitionerSetUp(PetscPartitioner part)
215abe9303eSLisandro Dalcin {
216abe9303eSLisandro Dalcin   PetscErrorCode ierr;
217abe9303eSLisandro Dalcin 
218abe9303eSLisandro Dalcin   PetscFunctionBegin;
219abe9303eSLisandro Dalcin   PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1);
220abe9303eSLisandro Dalcin   if (part->ops->setup) {ierr = (*part->ops->setup)(part);CHKERRQ(ierr);}
221abe9303eSLisandro Dalcin   PetscFunctionReturn(0);
222abe9303eSLisandro Dalcin }
223abe9303eSLisandro Dalcin 
224abe9303eSLisandro Dalcin /*@
225abe9303eSLisandro Dalcin   PetscPartitionerReset - Resets data structures for the PetscPartitioner
226abe9303eSLisandro Dalcin 
227abe9303eSLisandro Dalcin   Collective on PetscPartitioner
228abe9303eSLisandro Dalcin 
229abe9303eSLisandro Dalcin   Input Parameter:
230abe9303eSLisandro Dalcin . part - the PetscPartitioner object to reset
231abe9303eSLisandro Dalcin 
232abe9303eSLisandro Dalcin   Level: developer
233abe9303eSLisandro Dalcin 
234abe9303eSLisandro Dalcin .seealso: PetscPartitionerSetUp(), PetscPartitionerDestroy()
235abe9303eSLisandro Dalcin @*/
236abe9303eSLisandro Dalcin PetscErrorCode PetscPartitionerReset(PetscPartitioner part)
237abe9303eSLisandro Dalcin {
238abe9303eSLisandro Dalcin   PetscErrorCode ierr;
239abe9303eSLisandro Dalcin 
240abe9303eSLisandro Dalcin   PetscFunctionBegin;
241abe9303eSLisandro Dalcin   PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1);
242abe9303eSLisandro Dalcin   if (part->ops->reset) {ierr = (*part->ops->reset)(part);CHKERRQ(ierr);}
243abe9303eSLisandro Dalcin   PetscFunctionReturn(0);
244abe9303eSLisandro Dalcin }
245abe9303eSLisandro Dalcin 
246abe9303eSLisandro Dalcin /*@
247abe9303eSLisandro Dalcin   PetscPartitionerDestroy - Destroys a PetscPartitioner object
248abe9303eSLisandro Dalcin 
249abe9303eSLisandro Dalcin   Collective on PetscPartitioner
250abe9303eSLisandro Dalcin 
251abe9303eSLisandro Dalcin   Input Parameter:
252abe9303eSLisandro Dalcin . part - the PetscPartitioner object to destroy
253abe9303eSLisandro Dalcin 
254abe9303eSLisandro Dalcin   Level: developer
255abe9303eSLisandro Dalcin 
256abe9303eSLisandro Dalcin .seealso: PetscPartitionerView()
257abe9303eSLisandro Dalcin @*/
258abe9303eSLisandro Dalcin PetscErrorCode PetscPartitionerDestroy(PetscPartitioner *part)
259abe9303eSLisandro Dalcin {
260abe9303eSLisandro Dalcin   PetscErrorCode ierr;
261abe9303eSLisandro Dalcin 
262abe9303eSLisandro Dalcin   PetscFunctionBegin;
263abe9303eSLisandro Dalcin   if (!*part) PetscFunctionReturn(0);
264abe9303eSLisandro Dalcin   PetscValidHeaderSpecific((*part), PETSCPARTITIONER_CLASSID, 1);
265abe9303eSLisandro Dalcin 
266ea78f98cSLisandro Dalcin   if (--((PetscObject)(*part))->refct > 0) {*part = NULL; PetscFunctionReturn(0);}
267abe9303eSLisandro Dalcin   ((PetscObject) (*part))->refct = 0;
268abe9303eSLisandro Dalcin 
269abe9303eSLisandro Dalcin   ierr = PetscPartitionerReset(*part);CHKERRQ(ierr);
270abe9303eSLisandro Dalcin 
271abe9303eSLisandro Dalcin   ierr = PetscViewerDestroy(&(*part)->viewer);CHKERRQ(ierr);
272abe9303eSLisandro Dalcin   ierr = PetscViewerDestroy(&(*part)->viewerGraph);CHKERRQ(ierr);
273abe9303eSLisandro Dalcin   if ((*part)->ops->destroy) {ierr = (*(*part)->ops->destroy)(*part);CHKERRQ(ierr);}
274abe9303eSLisandro Dalcin   ierr = PetscHeaderDestroy(part);CHKERRQ(ierr);
275abe9303eSLisandro Dalcin   PetscFunctionReturn(0);
276abe9303eSLisandro Dalcin }
277abe9303eSLisandro Dalcin 
278abe9303eSLisandro Dalcin /*@
279abe9303eSLisandro Dalcin   PetscPartitionerPartition - Partition a graph
280abe9303eSLisandro Dalcin 
281abe9303eSLisandro Dalcin   Collective on PetscPartitioner
282abe9303eSLisandro Dalcin 
283abe9303eSLisandro Dalcin   Input Parameters:
284abe9303eSLisandro Dalcin + part    - The PetscPartitioner
285abe9303eSLisandro Dalcin . nparts  - Number of partitions
286abe9303eSLisandro Dalcin . numVertices - Number of vertices in the local part of the graph
287abe9303eSLisandro Dalcin . start - row pointers for the local part of the graph (CSR style)
288abe9303eSLisandro Dalcin . adjacency - adjacency list (CSR style)
289abe9303eSLisandro Dalcin . vertexSection - PetscSection describing the absolute weight of each local vertex (can be NULL)
290abe9303eSLisandro Dalcin - targetSection - PetscSection describing the absolute weight of each partition (can be NULL)
291abe9303eSLisandro Dalcin 
292abe9303eSLisandro Dalcin   Output Parameters:
293abe9303eSLisandro Dalcin + partSection     - The PetscSection giving the division of points by partition
294abe9303eSLisandro Dalcin - partition       - The list of points by partition
295abe9303eSLisandro Dalcin 
296abe9303eSLisandro Dalcin   Options Database:
297abe9303eSLisandro Dalcin + -petscpartitioner_view - View the partitioner information
298abe9303eSLisandro Dalcin - -petscpartitioner_view_graph - View the graph we are partitioning
299abe9303eSLisandro Dalcin 
300abe9303eSLisandro Dalcin   Notes:
301abe9303eSLisandro 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.
302abe9303eSLisandro 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.
303abe9303eSLisandro Dalcin 
304abe9303eSLisandro Dalcin   Level: developer
305abe9303eSLisandro Dalcin 
306*6e0dc72eSMatthew G. Knepley .seealso PetscPartitionerCreate(), PetscPartitionerSetType(), PetscSectionCreate(), PetscSectionSetChart(), PetscSectionSetDof()
307abe9303eSLisandro Dalcin @*/
308abe9303eSLisandro Dalcin PetscErrorCode PetscPartitionerPartition(PetscPartitioner part, PetscInt nparts, PetscInt numVertices, PetscInt start[], PetscInt adjacency[], PetscSection vertexSection, PetscSection targetSection, PetscSection partSection, IS *partition)
309abe9303eSLisandro Dalcin {
310abe9303eSLisandro Dalcin   PetscErrorCode ierr;
311abe9303eSLisandro Dalcin 
312abe9303eSLisandro Dalcin   PetscFunctionBegin;
313abe9303eSLisandro Dalcin   PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1);
314abe9303eSLisandro Dalcin   PetscValidLogicalCollectiveInt(part, nparts, 2);
3152c71b3e2SJacob Faibussowitsch   PetscCheckFalse(nparts <= 0,PetscObjectComm((PetscObject) part), PETSC_ERR_ARG_OUTOFRANGE, "Number of parts must be positive");
3162c71b3e2SJacob Faibussowitsch   PetscCheckFalse(numVertices < 0,PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Number of vertices must be non-negative");
317abe9303eSLisandro Dalcin   if (numVertices && !part->noGraph) {
318abe9303eSLisandro Dalcin     PetscValidIntPointer(start, 4);
319abe9303eSLisandro Dalcin     PetscValidIntPointer(start + numVertices, 4);
320abe9303eSLisandro Dalcin     if (start[numVertices]) PetscValidIntPointer(adjacency, 5);
321abe9303eSLisandro Dalcin   }
322abe9303eSLisandro Dalcin   if (vertexSection) {
323abe9303eSLisandro Dalcin     PetscInt s,e;
324abe9303eSLisandro Dalcin 
325abe9303eSLisandro Dalcin     PetscValidHeaderSpecific(vertexSection, PETSC_SECTION_CLASSID, 6);
326abe9303eSLisandro Dalcin     ierr = PetscSectionGetChart(vertexSection, &s, &e);CHKERRQ(ierr);
3272c71b3e2SJacob Faibussowitsch     PetscCheckFalse(s > 0 || e < numVertices,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Invalid vertexSection chart [%D,%D)",s,e);
328abe9303eSLisandro Dalcin   }
329abe9303eSLisandro Dalcin   if (targetSection) {
330abe9303eSLisandro Dalcin     PetscInt s,e;
331abe9303eSLisandro Dalcin 
332abe9303eSLisandro Dalcin     PetscValidHeaderSpecific(targetSection, PETSC_SECTION_CLASSID, 7);
333abe9303eSLisandro Dalcin     ierr = PetscSectionGetChart(targetSection, &s, &e);CHKERRQ(ierr);
3342c71b3e2SJacob Faibussowitsch     PetscCheckFalse(s > 0 || e < nparts,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Invalid targetSection chart [%D,%D)",s,e);
335abe9303eSLisandro Dalcin   }
336abe9303eSLisandro Dalcin   PetscValidHeaderSpecific(partSection, PETSC_SECTION_CLASSID, 8);
337abe9303eSLisandro Dalcin   PetscValidPointer(partition, 9);
338abe9303eSLisandro Dalcin 
339abe9303eSLisandro Dalcin   ierr = PetscSectionReset(partSection);CHKERRQ(ierr);
340abe9303eSLisandro Dalcin   ierr = PetscSectionSetChart(partSection, 0, nparts);CHKERRQ(ierr);
341abe9303eSLisandro Dalcin   if (nparts == 1) { /* quick */
342abe9303eSLisandro Dalcin     ierr = PetscSectionSetDof(partSection, 0, numVertices);CHKERRQ(ierr);
343abe9303eSLisandro Dalcin     ierr = ISCreateStride(PetscObjectComm((PetscObject)part),numVertices,0,1,partition);CHKERRQ(ierr);
344abe9303eSLisandro Dalcin   } else {
3452c71b3e2SJacob Faibussowitsch     PetscCheckFalse(!part->ops->partition,PetscObjectComm((PetscObject) part), PETSC_ERR_SUP, "PetscPartitioner %s has no partitioning method", ((PetscObject)part)->type_name);
346abe9303eSLisandro Dalcin     ierr = (*part->ops->partition)(part, nparts, numVertices, start, adjacency, vertexSection, targetSection, partSection, partition);CHKERRQ(ierr);
347abe9303eSLisandro Dalcin   }
348abe9303eSLisandro Dalcin   ierr = PetscSectionSetUp(partSection);CHKERRQ(ierr);
349abe9303eSLisandro Dalcin   if (part->viewerGraph) {
350abe9303eSLisandro Dalcin     PetscViewer viewer = part->viewerGraph;
351abe9303eSLisandro Dalcin     PetscBool   isascii;
352abe9303eSLisandro Dalcin     PetscInt    v, i;
353abe9303eSLisandro Dalcin     PetscMPIInt rank;
354abe9303eSLisandro Dalcin 
355ffc4695bSBarry Smith     ierr = MPI_Comm_rank(PetscObjectComm((PetscObject) viewer), &rank);CHKERRMPI(ierr);
356abe9303eSLisandro Dalcin     ierr = PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERASCII, &isascii);CHKERRQ(ierr);
357abe9303eSLisandro Dalcin     if (isascii) {
358abe9303eSLisandro Dalcin       ierr = PetscViewerASCIIPushSynchronized(viewer);CHKERRQ(ierr);
359abe9303eSLisandro Dalcin       ierr = PetscViewerASCIISynchronizedPrintf(viewer, "[%d]Nv: %D\n", rank, numVertices);CHKERRQ(ierr);
360abe9303eSLisandro Dalcin       for (v = 0; v < numVertices; ++v) {
361abe9303eSLisandro Dalcin         const PetscInt s = start[v];
362abe9303eSLisandro Dalcin         const PetscInt e = start[v+1];
363abe9303eSLisandro Dalcin 
364abe9303eSLisandro Dalcin         ierr = PetscViewerASCIISynchronizedPrintf(viewer, "[%d]  ", rank);CHKERRQ(ierr);
365abe9303eSLisandro Dalcin         for (i = s; i < e; ++i) {ierr = PetscViewerASCIISynchronizedPrintf(viewer, "%D ", adjacency[i]);CHKERRQ(ierr);}
366abe9303eSLisandro Dalcin         ierr = PetscViewerASCIISynchronizedPrintf(viewer, "[%D-%D)\n", s, e);CHKERRQ(ierr);
367abe9303eSLisandro Dalcin       }
368abe9303eSLisandro Dalcin       ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
369abe9303eSLisandro Dalcin       ierr = PetscViewerASCIIPopSynchronized(viewer);CHKERRQ(ierr);
370abe9303eSLisandro Dalcin     }
371abe9303eSLisandro Dalcin   }
372abe9303eSLisandro Dalcin   if (part->viewer) {
373abe9303eSLisandro Dalcin     ierr = PetscPartitionerView(part,part->viewer);CHKERRQ(ierr);
374abe9303eSLisandro Dalcin   }
375abe9303eSLisandro Dalcin   PetscFunctionReturn(0);
376abe9303eSLisandro Dalcin }
377abe9303eSLisandro Dalcin 
378abe9303eSLisandro Dalcin /*@
379abe9303eSLisandro Dalcin   PetscPartitionerCreate - Creates an empty PetscPartitioner object. The type can then be set with PetscPartitionerSetType().
380abe9303eSLisandro Dalcin 
381abe9303eSLisandro Dalcin   Collective
382abe9303eSLisandro Dalcin 
383abe9303eSLisandro Dalcin   Input Parameter:
384abe9303eSLisandro Dalcin . comm - The communicator for the PetscPartitioner object
385abe9303eSLisandro Dalcin 
386abe9303eSLisandro Dalcin   Output Parameter:
387abe9303eSLisandro Dalcin . part - The PetscPartitioner object
388abe9303eSLisandro Dalcin 
389abe9303eSLisandro Dalcin   Level: beginner
390abe9303eSLisandro Dalcin 
391*6e0dc72eSMatthew G. Knepley .seealso: PetscPartitionerSetType(), PetscPartitionerDestroy()
392abe9303eSLisandro Dalcin @*/
393abe9303eSLisandro Dalcin PetscErrorCode PetscPartitionerCreate(MPI_Comm comm, PetscPartitioner *part)
394abe9303eSLisandro Dalcin {
395abe9303eSLisandro Dalcin   PetscPartitioner p;
396abe9303eSLisandro Dalcin   const char       *partitionerType = NULL;
397abe9303eSLisandro Dalcin   PetscErrorCode   ierr;
398abe9303eSLisandro Dalcin 
399abe9303eSLisandro Dalcin   PetscFunctionBegin;
400abe9303eSLisandro Dalcin   PetscValidPointer(part, 2);
401abe9303eSLisandro Dalcin   *part = NULL;
402abe9303eSLisandro Dalcin   ierr = PetscPartitionerInitializePackage();CHKERRQ(ierr);
403abe9303eSLisandro Dalcin 
404abe9303eSLisandro Dalcin   ierr = PetscHeaderCreate(p, PETSCPARTITIONER_CLASSID, "PetscPartitioner", "Graph Partitioner", "PetscPartitioner", comm, PetscPartitionerDestroy, PetscPartitionerView);CHKERRQ(ierr);
405d7cc930eSLisandro Dalcin   ierr = PetscPartitionerGetDefaultType(comm, &partitionerType);CHKERRQ(ierr);
406abe9303eSLisandro Dalcin   ierr = PetscPartitionerSetType(p, partitionerType);CHKERRQ(ierr);
407abe9303eSLisandro Dalcin 
408abe9303eSLisandro Dalcin   p->edgeCut = 0;
409abe9303eSLisandro Dalcin   p->balance = 0.0;
410abe9303eSLisandro Dalcin   p->usevwgt = PETSC_TRUE;
411abe9303eSLisandro Dalcin 
412abe9303eSLisandro Dalcin   *part = p;
413abe9303eSLisandro Dalcin   PetscFunctionReturn(0);
414abe9303eSLisandro Dalcin }
415