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, ¤tType)); 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