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 @*/ 26*9371c9d4SSatish Balay PetscErrorCode PetscPartitionerSetType(PetscPartitioner part, PetscPartitionerType name) { 27abe9303eSLisandro Dalcin PetscErrorCode (*r)(PetscPartitioner); 28abe9303eSLisandro Dalcin PetscBool match; 29abe9303eSLisandro Dalcin 30abe9303eSLisandro Dalcin PetscFunctionBegin; 31abe9303eSLisandro Dalcin PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1); 329566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)part, name, &match)); 33abe9303eSLisandro Dalcin if (match) PetscFunctionReturn(0); 34abe9303eSLisandro Dalcin 359566063dSJacob Faibussowitsch PetscCall(PetscPartitionerRegisterAll()); 369566063dSJacob Faibussowitsch PetscCall(PetscFunctionListFind(PetscPartitionerList, name, &r)); 3728b400f6SJacob Faibussowitsch PetscCheck(r, PetscObjectComm((PetscObject)part), PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown PetscPartitioner type: %s", name); 38abe9303eSLisandro Dalcin 39dbbe0bcdSBarry Smith PetscTryTypeMethod(part, destroy); 40abe9303eSLisandro Dalcin part->noGraph = PETSC_FALSE; 419566063dSJacob Faibussowitsch PetscCall(PetscMemzero(part->ops, sizeof(*part->ops))); 429566063dSJacob Faibussowitsch PetscCall(PetscObjectChangeTypeName((PetscObject)part, name)); 439566063dSJacob Faibussowitsch PetscCall((*r)(part)); 44abe9303eSLisandro Dalcin PetscFunctionReturn(0); 45abe9303eSLisandro Dalcin } 46abe9303eSLisandro Dalcin 47abe9303eSLisandro Dalcin /*@C 48abe9303eSLisandro Dalcin PetscPartitionerGetType - Gets the PetscPartitioner type name (as a string) from the object. 49abe9303eSLisandro Dalcin 50abe9303eSLisandro Dalcin Not Collective 51abe9303eSLisandro Dalcin 52abe9303eSLisandro Dalcin Input Parameter: 53abe9303eSLisandro Dalcin . part - The PetscPartitioner 54abe9303eSLisandro Dalcin 55abe9303eSLisandro Dalcin Output Parameter: 56abe9303eSLisandro Dalcin . name - The PetscPartitioner type name 57abe9303eSLisandro Dalcin 58abe9303eSLisandro Dalcin Level: intermediate 59abe9303eSLisandro Dalcin 60db781477SPatrick Sanan .seealso: `PetscPartitionerSetType()`, `PetscPartitionerCreate()` 61abe9303eSLisandro Dalcin @*/ 62*9371c9d4SSatish Balay PetscErrorCode PetscPartitionerGetType(PetscPartitioner part, PetscPartitionerType *name) { 63abe9303eSLisandro Dalcin PetscFunctionBegin; 64abe9303eSLisandro Dalcin PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1); 65abe9303eSLisandro Dalcin PetscValidPointer(name, 2); 66abe9303eSLisandro Dalcin *name = ((PetscObject)part)->type_name; 67abe9303eSLisandro Dalcin PetscFunctionReturn(0); 68abe9303eSLisandro Dalcin } 69abe9303eSLisandro Dalcin 70abe9303eSLisandro Dalcin /*@C 71abe9303eSLisandro Dalcin PetscPartitionerViewFromOptions - View from Options 72abe9303eSLisandro Dalcin 73abe9303eSLisandro Dalcin Collective on PetscPartitioner 74abe9303eSLisandro Dalcin 75abe9303eSLisandro Dalcin Input Parameters: 76abe9303eSLisandro Dalcin + A - the PetscPartitioner object 77abe9303eSLisandro Dalcin . obj - Optional object 78abe9303eSLisandro Dalcin - name - command line option 79abe9303eSLisandro Dalcin 80abe9303eSLisandro Dalcin Level: intermediate 81db781477SPatrick Sanan .seealso: `PetscPartitionerView()`, `PetscObjectViewFromOptions()` 82abe9303eSLisandro Dalcin @*/ 83*9371c9d4SSatish Balay PetscErrorCode PetscPartitionerViewFromOptions(PetscPartitioner A, PetscObject obj, const char name[]) { 84abe9303eSLisandro Dalcin PetscFunctionBegin; 85abe9303eSLisandro Dalcin PetscValidHeaderSpecific(A, PETSCPARTITIONER_CLASSID, 1); 869566063dSJacob Faibussowitsch PetscCall(PetscObjectViewFromOptions((PetscObject)A, obj, name)); 87abe9303eSLisandro Dalcin PetscFunctionReturn(0); 88abe9303eSLisandro Dalcin } 89abe9303eSLisandro Dalcin 90abe9303eSLisandro Dalcin /*@ 91abe9303eSLisandro Dalcin PetscPartitionerView - Views a PetscPartitioner 92abe9303eSLisandro Dalcin 93abe9303eSLisandro Dalcin Collective on PetscPartitioner 94abe9303eSLisandro Dalcin 95d8d19677SJose E. Roman Input Parameters: 96abe9303eSLisandro Dalcin + part - the PetscPartitioner object to view 97abe9303eSLisandro Dalcin - v - the viewer 98abe9303eSLisandro Dalcin 99abe9303eSLisandro Dalcin Level: developer 100abe9303eSLisandro Dalcin 101db781477SPatrick Sanan .seealso: `PetscPartitionerDestroy()` 102abe9303eSLisandro Dalcin @*/ 103*9371c9d4SSatish Balay PetscErrorCode PetscPartitionerView(PetscPartitioner part, PetscViewer v) { 104abe9303eSLisandro Dalcin PetscMPIInt size; 105abe9303eSLisandro Dalcin PetscBool isascii; 106abe9303eSLisandro Dalcin 107abe9303eSLisandro Dalcin PetscFunctionBegin; 108abe9303eSLisandro Dalcin PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1); 1099566063dSJacob Faibussowitsch if (!v) PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)part), &v)); 1109566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERASCII, &isascii)); 111abe9303eSLisandro Dalcin if (isascii) { 1129566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)part), &size)); 1139566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(v, "Graph Partitioner: %d MPI Process%s\n", size, size > 1 ? "es" : "")); 1149566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(v, " type: %s\n", ((PetscObject)part)->type_name)); 11563a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(v, " edge cut: %" PetscInt_FMT "\n", part->edgeCut)); 11663a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(v, " balance: %.2g\n", (double)part->balance)); 1179566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(v, " use vertex weights: %d\n", part->usevwgt)); 118abe9303eSLisandro Dalcin } 119dbbe0bcdSBarry Smith PetscTryTypeMethod(part, view, v); 120abe9303eSLisandro Dalcin PetscFunctionReturn(0); 121abe9303eSLisandro Dalcin } 122abe9303eSLisandro Dalcin 123*9371c9d4SSatish Balay static PetscErrorCode PetscPartitionerGetDefaultType(MPI_Comm comm, const char **defaultType) { 124abe9303eSLisandro Dalcin PetscMPIInt size; 125abe9303eSLisandro Dalcin 126abe9303eSLisandro Dalcin PetscFunctionBegin; 1279566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(comm, &size)); 128abe9303eSLisandro Dalcin if (size == 1) { 129abe9303eSLisandro Dalcin *defaultType = PETSCPARTITIONERSIMPLE; 130abe9303eSLisandro Dalcin } else { 131abe9303eSLisandro Dalcin #if defined(PETSC_HAVE_PARMETIS) 132abe9303eSLisandro Dalcin *defaultType = PETSCPARTITIONERPARMETIS; 133abe9303eSLisandro Dalcin #elif defined(PETSC_HAVE_PTSCOTCH) 134abe9303eSLisandro Dalcin *defaultType = PETSCPARTITIONERPTSCOTCH; 135abe9303eSLisandro Dalcin #elif defined(PETSC_HAVE_CHACO) 136abe9303eSLisandro Dalcin *defaultType = PETSCPARTITIONERCHACO; 137abe9303eSLisandro Dalcin #else 138abe9303eSLisandro Dalcin *defaultType = PETSCPARTITIONERSIMPLE; 139abe9303eSLisandro Dalcin #endif 140abe9303eSLisandro Dalcin } 141abe9303eSLisandro Dalcin PetscFunctionReturn(0); 142abe9303eSLisandro Dalcin } 143abe9303eSLisandro Dalcin 144abe9303eSLisandro Dalcin /*@ 145abe9303eSLisandro Dalcin PetscPartitionerSetFromOptions - sets parameters in a PetscPartitioner from the options database 146abe9303eSLisandro Dalcin 147abe9303eSLisandro Dalcin Collective on PetscPartitioner 148abe9303eSLisandro Dalcin 149abe9303eSLisandro Dalcin Input Parameter: 150abe9303eSLisandro Dalcin . part - the PetscPartitioner object to set options for 151abe9303eSLisandro Dalcin 152abe9303eSLisandro Dalcin Options Database Keys: 153abe9303eSLisandro Dalcin + -petscpartitioner_type <type> - Sets the PetscPartitioner type; use -help for a list of available types 154abe9303eSLisandro Dalcin . -petscpartitioner_use_vertex_weights - Uses weights associated with the graph vertices 155abe9303eSLisandro Dalcin - -petscpartitioner_view_graph - View the graph each time PetscPartitionerPartition is called. Viewer can be customized, see PetscOptionsGetViewer() 156abe9303eSLisandro Dalcin 157abe9303eSLisandro Dalcin Level: developer 158abe9303eSLisandro Dalcin 159db781477SPatrick Sanan .seealso: `PetscPartitionerView()`, `PetscPartitionerSetType()`, `PetscPartitionerPartition()` 160abe9303eSLisandro Dalcin @*/ 161*9371c9d4SSatish Balay PetscErrorCode PetscPartitionerSetFromOptions(PetscPartitioner part) { 162d7cc930eSLisandro Dalcin const char *currentType = NULL; 163abe9303eSLisandro Dalcin char name[256]; 164abe9303eSLisandro Dalcin PetscBool flg; 165abe9303eSLisandro Dalcin 166abe9303eSLisandro Dalcin PetscFunctionBegin; 167abe9303eSLisandro Dalcin PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1); 168d0609cedSBarry Smith PetscObjectOptionsBegin((PetscObject)part); 1699566063dSJacob Faibussowitsch PetscCall(PetscPartitionerGetType(part, ¤tType)); 1709566063dSJacob Faibussowitsch PetscCall(PetscOptionsFList("-petscpartitioner_type", "Graph partitioner", "PetscPartitionerSetType", PetscPartitionerList, currentType, name, sizeof(name), &flg)); 1711baa6e33SBarry Smith if (flg) PetscCall(PetscPartitionerSetType(part, name)); 1729566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-petscpartitioner_use_vertex_weights", "Use vertex weights", "", part->usevwgt, &part->usevwgt, NULL)); 173dbbe0bcdSBarry Smith PetscTryTypeMethod(part, setfromoptions, PetscOptionsObject); 1749566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&part->viewer)); 1759566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&part->viewerGraph)); 1769566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetViewer(((PetscObject)part)->comm, ((PetscObject)part)->options, ((PetscObject)part)->prefix, "-petscpartitioner_view", &part->viewer, NULL, NULL)); 1779566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetViewer(((PetscObject)part)->comm, ((PetscObject)part)->options, ((PetscObject)part)->prefix, "-petscpartitioner_view_graph", &part->viewerGraph, NULL, &part->viewGraph)); 178abe9303eSLisandro Dalcin /* process any options handlers added with PetscObjectAddOptionsHandler() */ 179dbbe0bcdSBarry Smith PetscCall(PetscObjectProcessOptionsHandlers((PetscObject)part, PetscOptionsObject)); 180d0609cedSBarry Smith PetscOptionsEnd(); 181abe9303eSLisandro Dalcin PetscFunctionReturn(0); 182abe9303eSLisandro Dalcin } 183abe9303eSLisandro Dalcin 184abe9303eSLisandro Dalcin /*@ 185abe9303eSLisandro Dalcin PetscPartitionerSetUp - Construct data structures for the PetscPartitioner 186abe9303eSLisandro Dalcin 187abe9303eSLisandro Dalcin Collective on PetscPartitioner 188abe9303eSLisandro Dalcin 189abe9303eSLisandro Dalcin Input Parameter: 190abe9303eSLisandro Dalcin . part - the PetscPartitioner object to setup 191abe9303eSLisandro Dalcin 192abe9303eSLisandro Dalcin Level: developer 193abe9303eSLisandro Dalcin 194db781477SPatrick Sanan .seealso: `PetscPartitionerView()`, `PetscPartitionerDestroy()` 195abe9303eSLisandro Dalcin @*/ 196*9371c9d4SSatish Balay PetscErrorCode PetscPartitionerSetUp(PetscPartitioner part) { 197abe9303eSLisandro Dalcin PetscFunctionBegin; 198abe9303eSLisandro Dalcin PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1); 199dbbe0bcdSBarry Smith PetscTryTypeMethod(part, setup); 200abe9303eSLisandro Dalcin PetscFunctionReturn(0); 201abe9303eSLisandro Dalcin } 202abe9303eSLisandro Dalcin 203abe9303eSLisandro Dalcin /*@ 204abe9303eSLisandro Dalcin PetscPartitionerReset - Resets data structures for the PetscPartitioner 205abe9303eSLisandro Dalcin 206abe9303eSLisandro Dalcin Collective on PetscPartitioner 207abe9303eSLisandro Dalcin 208abe9303eSLisandro Dalcin Input Parameter: 209abe9303eSLisandro Dalcin . part - the PetscPartitioner object to reset 210abe9303eSLisandro Dalcin 211abe9303eSLisandro Dalcin Level: developer 212abe9303eSLisandro Dalcin 213db781477SPatrick Sanan .seealso: `PetscPartitionerSetUp()`, `PetscPartitionerDestroy()` 214abe9303eSLisandro Dalcin @*/ 215*9371c9d4SSatish Balay PetscErrorCode PetscPartitionerReset(PetscPartitioner part) { 216abe9303eSLisandro Dalcin PetscFunctionBegin; 217abe9303eSLisandro Dalcin PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1); 218dbbe0bcdSBarry Smith PetscTryTypeMethod(part, reset); 219abe9303eSLisandro Dalcin PetscFunctionReturn(0); 220abe9303eSLisandro Dalcin } 221abe9303eSLisandro Dalcin 222abe9303eSLisandro Dalcin /*@ 223abe9303eSLisandro Dalcin PetscPartitionerDestroy - Destroys a PetscPartitioner object 224abe9303eSLisandro Dalcin 225abe9303eSLisandro Dalcin Collective on PetscPartitioner 226abe9303eSLisandro Dalcin 227abe9303eSLisandro Dalcin Input Parameter: 228abe9303eSLisandro Dalcin . part - the PetscPartitioner object to destroy 229abe9303eSLisandro Dalcin 230abe9303eSLisandro Dalcin Level: developer 231abe9303eSLisandro Dalcin 232db781477SPatrick Sanan .seealso: `PetscPartitionerView()` 233abe9303eSLisandro Dalcin @*/ 234*9371c9d4SSatish Balay PetscErrorCode PetscPartitionerDestroy(PetscPartitioner *part) { 235abe9303eSLisandro Dalcin PetscFunctionBegin; 236abe9303eSLisandro Dalcin if (!*part) PetscFunctionReturn(0); 237abe9303eSLisandro Dalcin PetscValidHeaderSpecific((*part), PETSCPARTITIONER_CLASSID, 1); 238abe9303eSLisandro Dalcin 239*9371c9d4SSatish Balay if (--((PetscObject)(*part))->refct > 0) { 240*9371c9d4SSatish Balay *part = NULL; 241*9371c9d4SSatish Balay PetscFunctionReturn(0); 242*9371c9d4SSatish Balay } 243abe9303eSLisandro Dalcin ((PetscObject)(*part))->refct = 0; 244abe9303eSLisandro Dalcin 2459566063dSJacob Faibussowitsch PetscCall(PetscPartitionerReset(*part)); 246abe9303eSLisandro Dalcin 2479566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&(*part)->viewer)); 2489566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&(*part)->viewerGraph)); 249dbbe0bcdSBarry Smith PetscTryTypeMethod((*part), destroy); 2509566063dSJacob Faibussowitsch PetscCall(PetscHeaderDestroy(part)); 251abe9303eSLisandro Dalcin PetscFunctionReturn(0); 252abe9303eSLisandro Dalcin } 253abe9303eSLisandro Dalcin 254abe9303eSLisandro Dalcin /*@ 255abe9303eSLisandro Dalcin PetscPartitionerPartition - Partition a graph 256abe9303eSLisandro Dalcin 257abe9303eSLisandro Dalcin Collective on PetscPartitioner 258abe9303eSLisandro Dalcin 259abe9303eSLisandro Dalcin Input Parameters: 260abe9303eSLisandro Dalcin + part - The PetscPartitioner 261abe9303eSLisandro Dalcin . nparts - Number of partitions 262abe9303eSLisandro Dalcin . numVertices - Number of vertices in the local part of the graph 263abe9303eSLisandro Dalcin . start - row pointers for the local part of the graph (CSR style) 264abe9303eSLisandro Dalcin . adjacency - adjacency list (CSR style) 265abe9303eSLisandro Dalcin . vertexSection - PetscSection describing the absolute weight of each local vertex (can be NULL) 266abe9303eSLisandro Dalcin - targetSection - PetscSection describing the absolute weight of each partition (can be NULL) 267abe9303eSLisandro Dalcin 268abe9303eSLisandro Dalcin Output Parameters: 269abe9303eSLisandro Dalcin + partSection - The PetscSection giving the division of points by partition 270abe9303eSLisandro Dalcin - partition - The list of points by partition 271abe9303eSLisandro Dalcin 272abe9303eSLisandro Dalcin Options Database: 273abe9303eSLisandro Dalcin + -petscpartitioner_view - View the partitioner information 274abe9303eSLisandro Dalcin - -petscpartitioner_view_graph - View the graph we are partitioning 275abe9303eSLisandro Dalcin 276abe9303eSLisandro Dalcin Notes: 277abe9303eSLisandro 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. 278abe9303eSLisandro 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. 279abe9303eSLisandro Dalcin 280abe9303eSLisandro Dalcin Level: developer 281abe9303eSLisandro Dalcin 282db781477SPatrick Sanan .seealso `PetscPartitionerCreate()`, `PetscPartitionerSetType()`, `PetscSectionCreate()`, `PetscSectionSetChart()`, `PetscSectionSetDof()` 283abe9303eSLisandro Dalcin @*/ 284*9371c9d4SSatish Balay PetscErrorCode PetscPartitionerPartition(PetscPartitioner part, PetscInt nparts, PetscInt numVertices, PetscInt start[], PetscInt adjacency[], PetscSection vertexSection, PetscSection targetSection, PetscSection partSection, IS *partition) { 285abe9303eSLisandro Dalcin PetscFunctionBegin; 286abe9303eSLisandro Dalcin PetscValidHeaderSpecific(part, PETSCPARTITIONER_CLASSID, 1); 287abe9303eSLisandro Dalcin PetscValidLogicalCollectiveInt(part, nparts, 2); 28808401ef6SPierre Jolivet PetscCheck(nparts > 0, PetscObjectComm((PetscObject)part), PETSC_ERR_ARG_OUTOFRANGE, "Number of parts must be positive"); 28908401ef6SPierre Jolivet PetscCheck(numVertices >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Number of vertices must be non-negative"); 290abe9303eSLisandro Dalcin if (numVertices && !part->noGraph) { 291abe9303eSLisandro Dalcin PetscValidIntPointer(start, 4); 292abe9303eSLisandro Dalcin PetscValidIntPointer(start + numVertices, 4); 293abe9303eSLisandro Dalcin if (start[numVertices]) PetscValidIntPointer(adjacency, 5); 294abe9303eSLisandro Dalcin } 295abe9303eSLisandro Dalcin if (vertexSection) { 296abe9303eSLisandro Dalcin PetscInt s, e; 297abe9303eSLisandro Dalcin 298abe9303eSLisandro Dalcin PetscValidHeaderSpecific(vertexSection, PETSC_SECTION_CLASSID, 6); 2999566063dSJacob Faibussowitsch PetscCall(PetscSectionGetChart(vertexSection, &s, &e)); 3001dca8a05SBarry Smith PetscCheck(s <= 0 && e >= numVertices, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Invalid vertexSection chart [%" PetscInt_FMT ",%" PetscInt_FMT ")", s, e); 301abe9303eSLisandro Dalcin } 302abe9303eSLisandro Dalcin if (targetSection) { 303abe9303eSLisandro Dalcin PetscInt s, e; 304abe9303eSLisandro Dalcin 305abe9303eSLisandro Dalcin PetscValidHeaderSpecific(targetSection, PETSC_SECTION_CLASSID, 7); 3069566063dSJacob Faibussowitsch PetscCall(PetscSectionGetChart(targetSection, &s, &e)); 3071dca8a05SBarry Smith PetscCheck(s <= 0 && e >= nparts, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Invalid targetSection chart [%" PetscInt_FMT ",%" PetscInt_FMT ")", s, e); 308abe9303eSLisandro Dalcin } 309abe9303eSLisandro Dalcin PetscValidHeaderSpecific(partSection, PETSC_SECTION_CLASSID, 8); 310abe9303eSLisandro Dalcin PetscValidPointer(partition, 9); 311abe9303eSLisandro Dalcin 3129566063dSJacob Faibussowitsch PetscCall(PetscSectionReset(partSection)); 3139566063dSJacob Faibussowitsch PetscCall(PetscSectionSetChart(partSection, 0, nparts)); 314abe9303eSLisandro Dalcin if (nparts == 1) { /* quick */ 3159566063dSJacob Faibussowitsch PetscCall(PetscSectionSetDof(partSection, 0, numVertices)); 3169566063dSJacob Faibussowitsch PetscCall(ISCreateStride(PetscObjectComm((PetscObject)part), numVertices, 0, 1, partition)); 317dbbe0bcdSBarry Smith } else PetscUseTypeMethod(part, partition, nparts, numVertices, start, adjacency, vertexSection, targetSection, partSection, partition); 3189566063dSJacob Faibussowitsch PetscCall(PetscSectionSetUp(partSection)); 319abe9303eSLisandro Dalcin if (part->viewerGraph) { 320abe9303eSLisandro Dalcin PetscViewer viewer = part->viewerGraph; 321abe9303eSLisandro Dalcin PetscBool isascii; 322abe9303eSLisandro Dalcin PetscInt v, i; 323abe9303eSLisandro Dalcin PetscMPIInt rank; 324abe9303eSLisandro Dalcin 3259566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)viewer), &rank)); 3269566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii)); 327abe9303eSLisandro Dalcin if (isascii) { 3289566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushSynchronized(viewer)); 32963a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d]Nv: %" PetscInt_FMT "\n", rank, numVertices)); 330abe9303eSLisandro Dalcin for (v = 0; v < numVertices; ++v) { 331abe9303eSLisandro Dalcin const PetscInt s = start[v]; 332abe9303eSLisandro Dalcin const PetscInt e = start[v + 1]; 333abe9303eSLisandro Dalcin 3349566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d] ", rank)); 33563a3b9bcSJacob Faibussowitsch for (i = s; i < e; ++i) PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "%" PetscInt_FMT " ", adjacency[i])); 33663a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%" PetscInt_FMT "-%" PetscInt_FMT ")\n", s, e)); 337abe9303eSLisandro Dalcin } 3389566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(viewer)); 3399566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopSynchronized(viewer)); 340abe9303eSLisandro Dalcin } 341abe9303eSLisandro Dalcin } 3421baa6e33SBarry Smith if (part->viewer) PetscCall(PetscPartitionerView(part, part->viewer)); 343abe9303eSLisandro Dalcin PetscFunctionReturn(0); 344abe9303eSLisandro Dalcin } 345abe9303eSLisandro Dalcin 346abe9303eSLisandro Dalcin /*@ 347abe9303eSLisandro Dalcin PetscPartitionerCreate - Creates an empty PetscPartitioner object. The type can then be set with PetscPartitionerSetType(). 348abe9303eSLisandro Dalcin 349abe9303eSLisandro Dalcin Collective 350abe9303eSLisandro Dalcin 351abe9303eSLisandro Dalcin Input Parameter: 352abe9303eSLisandro Dalcin . comm - The communicator for the PetscPartitioner object 353abe9303eSLisandro Dalcin 354abe9303eSLisandro Dalcin Output Parameter: 355abe9303eSLisandro Dalcin . part - The PetscPartitioner object 356abe9303eSLisandro Dalcin 357abe9303eSLisandro Dalcin Level: beginner 358abe9303eSLisandro Dalcin 359db781477SPatrick Sanan .seealso: `PetscPartitionerSetType()`, `PetscPartitionerDestroy()` 360abe9303eSLisandro Dalcin @*/ 361*9371c9d4SSatish Balay PetscErrorCode PetscPartitionerCreate(MPI_Comm comm, PetscPartitioner *part) { 362abe9303eSLisandro Dalcin PetscPartitioner p; 363abe9303eSLisandro Dalcin const char *partitionerType = NULL; 364abe9303eSLisandro Dalcin 365abe9303eSLisandro Dalcin PetscFunctionBegin; 366abe9303eSLisandro Dalcin PetscValidPointer(part, 2); 367abe9303eSLisandro Dalcin *part = NULL; 3689566063dSJacob Faibussowitsch PetscCall(PetscPartitionerInitializePackage()); 369abe9303eSLisandro Dalcin 3709566063dSJacob Faibussowitsch PetscCall(PetscHeaderCreate(p, PETSCPARTITIONER_CLASSID, "PetscPartitioner", "Graph Partitioner", "PetscPartitioner", comm, PetscPartitionerDestroy, PetscPartitionerView)); 3719566063dSJacob Faibussowitsch PetscCall(PetscPartitionerGetDefaultType(comm, &partitionerType)); 3729566063dSJacob Faibussowitsch PetscCall(PetscPartitionerSetType(p, partitionerType)); 373abe9303eSLisandro Dalcin 374abe9303eSLisandro Dalcin p->edgeCut = 0; 375abe9303eSLisandro Dalcin p->balance = 0.0; 376abe9303eSLisandro Dalcin p->usevwgt = PETSC_TRUE; 377abe9303eSLisandro Dalcin 378abe9303eSLisandro Dalcin *part = p; 379abe9303eSLisandro Dalcin PetscFunctionReturn(0); 380abe9303eSLisandro Dalcin } 381